0

テッセレーションされた地形のメッシュの変位マップとして2Dサンプラーで使用するテクスチャを作成します。渡された頂点座標を使用して、後続の頂点のパッチコーナーの滑らかな補間値を取得します。サンプラーから得られた高さの値を使用する場合、私が受け取るのは平面だけです。その値に100を掛けると、平面の高さが約100増加し、アルファ値が常に1であると信じるようになります。

これがGLSL評価シェーダーとテクスチャ設定です。

 #version 430

layout(triangles, equal_spacing, ccw) in;

uniform mat4 camera;
uniform mat4 model;

uniform sampler2D terrain;
//uniform float lod_factor;
uniform float size;

in vec4 WorldPos_ES_in[];
in vec2 TexCoord_ES_in[];
in vec3 Normal_ES_in[];

out vec4 WorldPos_FS_in;
out vec2 TexCoord_FS_in;
out vec3 Normal_FS_in;

vec3 interpolate3D(vec3, vec3, vec3);
vec2 interpolate2D(vec2, vec2, vec2);

void main()
{
 // Interpolate the attributes of the output vertex using the barycentric coordinates
 TexCoord_FS_in = interpolate2D(TexCoord_ES_in[0], TexCoord_ES_in[1], TexCoord_ES_in[2]);
 Normal_FS_in = interpolate3D(Normal_ES_in[0], Normal_ES_in[1], Normal_ES_in[2]);
 Normal_FS_in = normalize(Normal_FS_in);
 WorldPos_FS_in = vec4(interpolate3D(WorldPos_ES_in[0].xyz, WorldPos_ES_in[1].xyz,       WorldPos_ES_in[2].xyz),1);
 vec2 position=WorldPos_FS_in.xz;
 float Displacement = texture(terrain, position/size).a;

 //gl_Position = camera*model * WorldPos_FS_in;
 gl_Position = camera*model * vec4(WorldPos_FS_in.x, Displacement,WorldPos_FS_in.z, 1.0);

}
vec2 interpolate2D(vec2 v0, vec2 v1, vec2 v2)
{
 return vec2(gl_TessCoord.x) * v0 + vec2(gl_TessCoord.y) * v1 + vec2(gl_TessCoord.z) * v2;
}

vec3 interpolate3D(vec3 v0, vec3 v1, vec3 v2)
{
 return vec3(gl_TessCoord.x) * v0 + vec3(gl_TessCoord.y) * v1 + vec3(gl_TessCoord.z) * v2;
}

glActiveTexture(GL_TEXTURE1);
GLuint tex2 = createTerrainMap();
glBindTexture(GL_TEXTURE_2D, tex2);
shader->setUniform("terrain", 1); 

static GLuint createTerrainMap(){

GLuint texName;
glGenTextures(1, &texName);    
glBindTexture(GL_TEXTURE_2D, texName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, size+1, size+1, 0, GL_RGBA, GL_FLOAT, terrainM);

return texName;
}

terrainMは次のように宣言されます

GLfloat terrain[size+1][size+1][4];

前述のように、頂点座標を使用すると正しい結果が得られますが、ディスプレースメントマップの目的は無効になります。さらに、TexCoord_ES_inであるGL_TEXTURE1としてファイルから別のテクスチャを使用します。これは、フラグメントシェーダー用であり、正しく適用されます。変位した値ではなく、平面を引き起こしている原因について何か考えはありますか?

4

1 に答える 1

0

TECは、内部の重心座標の外側の三角形の位置に関するデータを提供しないためです。三角形に補間されたデータを使用することは無意味です。ワールド座標が0から任意の量までである私の状況では、正しい高さを見つけるために別のUV座標のセットが必要です。

于 2013-03-06T18:24:04.707 に答える