2013-03-03 19 views
0

我创建了一个纹理用于​​二维采样器作为镶嵌地形网格的位移图。使用传入的顶点坐标,我有一个光滑的插值后续顶点的角点插值。当使用来自采样器的高度值时,我收到的所有数据都是一个平面。当我将这个值乘以一百时,飞机的高度就会增加大约一百,这让我相信阿尔法值永远是一个值。采样器2D阿尔法值保留在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]; 

如所提到的,使用顶点坐标产生正确的结果,但违背了位移图的目的。另外,我使用另一个纹理作为GL_TEXTURE1,它是TexCoord_ES_in,它用于片段着色器并正确应用。对于什么导致平面而不是流离失所的价值的任何想法?

回答

0

由于TEC没有提供关于其内部重心坐标之外的三角形位置的数据。使用三角形的内插数据是无用的。在我的情况下,世界坐标从0到任意数量,需要另一组UV坐标来找到正确的高度。