2013-03-03 3 views
0

Je crée une texture à utiliser dans un échantillonneur 2D comme carte de déplacement pour un maillage de terrain en mosaïque. En utilisant les coordonnées de sommet passées, j'ai une valeur interpolée lisse des coins de patch pour les sommets suivants. Lorsque j'utilise la valeur de hauteur dérivée de l'échantillonneur, tout ce que je reçois est un plan plat. Quand je multiplie cette valeur par cent, la hauteur de l'avion augmente d'une centaine, ce qui m'amène à croire que la valeur alpha est constamment une.Sampler 2D Alpha Séjours à 1

Voici le shader d'évaluation GLSL et la configuration de la texture.

#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; 
} 

et

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 est déclarée comme

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

Comme mentionné précédemment, en utilisant les coordonnées des sommets donne le résultat correct, mais encontre de l'objectif de la carte de déplacement. De plus, j'utilise une autre texture d'un fichier comme GL_TEXTURE1 qui est TexCoord_ES_in et c'est pour le fragment shader et correctement appliqué. Des idées sur ce qui cause le plan plat au lieu d'une valeur déplacée?

Répondre

0

Puisque le TEC ne fournit pas de données sur la position du triangle en dehors des coordonnées barycentriques à l'intérieur de celui-ci. L'utilisation des données interpolées pour le triangle est inutile. Dans ma situation où les coordonnées du monde sont de 0 à une quantité arbitraire, un autre ensemble de coordonnées UV est nécessaire pour trouver la bonne hauteur.

Questions connexes