2017-01-23 2 views
0

J'ai essayé d'implémenter une carte de hauteur pour mon shader de terrain, mais le terrain reste plat. La texture est correctement chargé dans le vertex shader, et je tente d'utiliser les valeurs demi-teinte de la texture basée sur les Ubs de mailles pour ajuster la hauteur du sommet:OpenGL: Déformation du terrain en utilisant un heightmap dans le vertex shader

//DIFFUSE VERTEX SHADER 
#version 330 

uniform mat4 projectionMatrix; 
uniform mat4 viewMatrix; 
uniform mat4 modelMatrix; 

in vec3 vertex; 
in vec3 normal; 
in vec2 uv; 

uniform sampler2D heightmap; 

out vec2 texCoord; 

void main(void){ 

vec3 _vertex = vertex; 
_vertex.y = texture(heightmap, uv).r * 2.f; 
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(_vertex, 1.f); 
texCoord = uv; 

} 

Fragment: (le splatmap fonctionne ignorer de sorte que)

uniform sampler2D splatmap; 
uniform sampler2D diffuse1; 
uniform sampler2D diffuse2; 
uniform sampler2D diffuse3; 
uniform sampler2D diffuse4; 

in vec2 texCoord; 
out vec4 fragment_color; 

void main(void) { 
///Loading the splatmap and the diffuse textures 
vec4 splatTexture = texture2D(splatmap, texCoord); 
vec4 diffuseTexture1 = texture2D(diffuse1, texCoord); 
vec4 diffuseTexture2 = texture2D(diffuse2, texCoord); 
vec4 diffuseTexture3 = texture2D(diffuse3, texCoord); 
vec4 diffuseTexture4 = texture2D(diffuse4, texCoord); 
//Interpolate between the different textures using the splatmap's rgb values (works) 
diffuseTexture1 *= splatTexture.r; 
diffuseTexture2 = mix (diffuseTexture1, diffuseTexture2, splatTexture.g); 
diffuseTexture3 = mix (diffuseTexture2,diffuseTexture3, splatTexture.b); 
vec4 outcolor = mix (diffuseTexture3, diffuseTexture4, splatTexture.a); 

fragment_color = outcolor; 

} 

Quelques infos supplémentaires: Toutes les textures sont chargées comme ça dans mon matériel de terrain et passé au shader (fonctionne correctement):

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, heightMap->getId()); 
glUniform1i (_shader->getUniformLocation("heightMap"),0); 
... 

Les Ubs de maillage plan sont mis en correspondance comme ceci:

(0,1) (1,1)

(0,0) (1,0)

Je suppose que je suis en train de faire quelque chose de terriblement mal , mais je ne peux pas comprendre quoi. Toute aide est appréciée!

+0

Quel est le but de '_textex'? Vous définissez '_vertex.y' mais après cela vous ne l'utiliserez plus jamais. –

+0

Je suis désolé, il est supposé dire _vertex au lieu de vertex à GL_position. J'ai oublié d'éditer – Possimpible

+0

Vous devriez essayer de trouver une fonction de génération de hauteur aléatoire et essayez-la à la place de la texture. De cette façon, vous pouvez voir si c'est la texture ou le 'gl_Position' qui cause le problème. –

Répondre

3

Est-ce que votre écriture ceci:

Ubs de maillage plan sont mis en correspondance comme ceci:

(0,1) (1,1)

(0,0) (1, 0)

... signifie que votre maillage se compose de seulement 4 sommets? Si oui, alors c'est là votre problème: Le shader Vertex ne peut pas créer de "nouveaux" sommets par magie, donc votre texture heightmap est échantillonnée à seulement 4 points (et rien entre les deux). Et comme vous échantillonnez les coordonnées de texture à des valeurs entières et vos coordonnées de texture et qu'elles sont à 0 et 1, vous échantillonnez effectivement la même coordonnée de texture, de sorte que vous allez voir le même déplacement pour les quatre sommets .

Solution: Tesselez votre maillage de base de sorte qu'il y ait réellement des vertices disponibles à déplacer. Un shader de tesselation est parfaitement bien pour ça.

EDIT:

BTW, vous pouvez simplyfiy votre vertex shader un peu: Pour les attributs en font un

in vec2 vertex; 

qui nécessite seulement 2/3 de l'espace de vec3, puisque vous n'utilise pas le composant z de toute façon.

float y = texture(heightmap, uv).r * 2.f; 
gl_Position = 
    projectionMatrix 
    * viewMatrix 
    * modelMatrix 
    * vec4(vertex.x, y, vertex.y, 1.f); 
+0

Merci beaucoup pour votre réponse élaborée! Vous aviez raison sur la quantité de sommets du maillage. J'ai mis à jour le plan de sorte qu'il contient maintenant 8192 sommets, et il y a quelques progrès. Cependant, ils ne sont pas interpolés donc il ressemble un peu à une montagne transparente. Est-ce là que vient le shader de tesselation? – Possimpible

+0

@Possimpible: Non, un shader de tesselation ne va pas vous aider avec ça. Pour moi, cela ressemble plus à un problème de coordonnées de texture. À savoir que vous utilisez la même coordonnée de texture pour échantillonner le déplacement des 4 sommets dans un quad. – datenwolf

+0

Je viens juste de dire que le problème a été causé par le mélange de la couleur outcolor dans le fragment shader. Quand je le mets dans un nouveau vec4 avec alpha mis à 1 cela fonctionne comme un charme. Merci pour votre aide! – Possimpible