2016-05-21 12 views
0

私は、あらかじめ決められたテクスチャ座標なしで私の地形をテクスチャしたいと思っています。頂点位置座標を使って、頂点シェーダまたはフレグマントシェーダの座標を決定したいと思います。私は今、(最大=(0,1,0))位置「XZ」座標を使用し、私は地面と90度である例えば壁を持っている場合、テクスチャは次のようになり:どのようにして頂点位置座標でテクスチャを作成できますか? OpenGL、C++

enter image description here

これらの座標をどのように変換して正常に動作させることができますか?

は、ここに私の頂点シェーダです:

#version 430 

in layout(location=0) vec3 position; 
in layout(location=1) vec2 textCoord; 
in layout(location=2) vec3 normal; 

out vec3 pos; 
out vec2 text; 
out vec3 norm; 


uniform mat4 transformation; 

void main() 
{ 
    gl_Position = transformation * vec4(position, 1.0); 
    norm = normal; 
    pos = position; 
    text = position.xz; 

} 

そして、ここに私のfragmantシェーダです:

#version 430 

in vec3 pos; 
in vec2 text; 
in vec3 norm; 

//uniform sampler2D textures[3]; 

layout(binding=3) uniform sampler2D texture_1; 
layout(binding=4) uniform sampler2D texture_2; 
layout(binding=5) uniform sampler2D texture_3; 

vec3 lightPosition = vec3(-200, 700, 50); 
vec3 lightAmbient = vec3(0,0,0); 
vec3 lightDiffuse = vec3(1,1,1); 
vec3 lightSpecular = vec3(1,1,1); 

out vec4 fragColor; 
vec4 theColor; 



void main() 
{ 
    vec3 unNormPos = pos; 
    vec3 lightVector = normalize(lightPosition) - normalize(pos); 
    //lightVector = normalize(lightVector); 

    float cosTheta = clamp(dot(normalize(lightVector), normalize(norm)), 0.5, 1.0); 

    if(pos.y <= 120){ 
     fragColor = texture2D(texture_2, text*0.05) * cosTheta; 
    } 
    if(pos.y > 120 && pos.y < 150){ 
     fragColor = (texture2D(texture_2, text*0.05) * (1 - (pos.y-120)/29) + texture2D(texture_3, text*0.05) * ((pos.y-120)/29))*cosTheta; 
    } 
    if(pos.y >= 150) 
    { 
     fragColor = texture2D(texture_3, text*0.05) * cosTheta; 
    } 
} 

EDIT:(Fons)

text = 0.05 * (position.xz + vec2(0,position.y)); 

enter image description here

text = 0.05 * (position.xz + vec2(position.y,position.y)); 

今、壁は機能しますが、地形はありません。 enter image description here

答えて

1

問題は、あなただけのxyz座標を使用して、正確に垂直な壁を表示するテクスチャ座標の計算式を考案することができないので、実際には非常に難しいものです。

これを視覚化するには、平らな土地の隣に丘があると想像してください。丘の上を進む道は平らな部分を越える道よりも長いので、テクスチャは平らな土地の上の丘の上に何度も巻くべきです。下の画像では、テクスチャは丘に5回、フラットピースに4回ラップされます。

Hill visualization

テクスチャ座標が左側に(0,0)ている場合は、右側に(4,0)または(5,0)すべきですか?両方の答えが有効なので、これは純粋にxyz座標に基づいて正しいテクスチャ座標を計算する関数がないことを証明します。

  • 壁は地形から独立して、それらを生成することにより補正することができ、正しいテクスチャを割り当てると、それらに座標それは実際にはもっと意味がない可能::(

    しかし、あなたの問題は、さまざまな方法で解決される可能性があります。

  • 法線マップ、高解像度のテクスチャ、またはさまざまなテクスチャの組み合わせを使用して、急勾配の丘の側面に詳細を追加できます。わからない優れた解決策があるかもしれません。

編集:Triplanar mappingが問題を解決します。

+0

Triplanarマッピングが私の問題を解決します。どうもありがとうございます :) –

0

試してみてください。

text = position.xz + vec2(0,y); 

また、私の代わりにフラグメントシェーダの頂点シェーダで*0.05スケールファクタを設定することをお勧めします。最終的なコードは次のようになります。

text = 0.05 * (position.xz + vec2(0,y)); 
+0

「vec2(0、y)」は「vec2(0、position.y)」を意味しますか?それは良いのように見えるが、まだ完璧ではない。新しいスクリーンショットで投稿を編集しました。 –

関連する問題