Passer plusieurs textures à un shader : PROBLEME
Bonjour :yaisse2:,
J'ai un problème avec un fragment shader, et je n'ai trouvé aucune réponse satisfaisante sur Internet. En gros, je dois passer trois textures à un shader (les trois textures sont valides car je peux les afficher sans problème). Toutefois, lorsque je les passe au shader, seule la première fonctionne seulement si je supprime les deux autres. Dès que j'en met 2, aucune ne fonctionne. Idem pour 3. Voici un code minimal reproduisant l'erreur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| glUseProgram (lightPyramidsTraversalProg);
// Première texture sur l'unité 0
glActiveTexture (GL_TEXTURE0);
glBindTexture (GL_TEXTURE_2D, lightPyramidsCreationPosition);
GLuint texLoc1 = glGetUniformLocation(lightPyramidsTraversalProg, "lightPyramidsPosition");
glUniform1i(texLoc1, 0);
// Seconde texture sur l'unité 1
glActiveTexture (GL_TEXTURE1);
glBindTexture (GL_TEXTURE_2D, lightPyramidsCreationNormal);
GLuint texLoc2 = glGetUniformLocation(lightPyramidsTraversalProg, "lightPyramidsNormal");
glUniform1i(texLoc2, 1);
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, lightPyramidsTraversalFBO);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawBuffer (GL_COLOR_ATTACHMENT0_EXT);
DrawQuad (512.0, 512.0);
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
glUseProgram (0); |
Le vertex shader :
Citation:
// Vertex shader
void main ()
{
gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_TexCoord[1] = gl_MultiTexCoord1;
//gl_TexCoord[2] = gl_MultiTexCoord2;
//gl_TexCoord[3] = gl_MultiTexCoord3;
}
Pour le fragment shader :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| // Fragment shader
uniform sampler2D lightPyramidsPosition;
uniform sampler2D lightPyramidsNormal;
/*uniform sampler2D lightPyramidsIntensity;
uniform sampler2D validityTexture;
uniform float currentLevel; // Niveau actuel du mipmap
uniform int currentResolution; // Resolution du niveau actuel du mipmap
uniform int previousResolution; // Resolution du niveau précédent du mipmap*/
void main ()
{
// float offset = 1.0 / currentResolution;
vec3 finalColor = vec3 (0.0, 0.0, 0.0);
// On récupère dans un premier temps la position, la normale et la couleur du pixel
vec3 positionPixel = texture2D (lightPyramidsPosition, gl_TexCoord[0].st, 0.0).xyz;
vec3 normalPixel = normalize (texture2D (lightPyramidsNormal, gl_TexCoord[1].st, 0.0).xyz);
//vec3 colorPixel = texture2D (lightPyramidsIntensity, gl_TexCoord[2].st, 0.0).xyz;
finalColor = positionPixel;
gl_FragData[0] = vec4 (finalColor, 0.0);
} |
Concrètement, la seule façon pour que ça fonctionne c'est : de ne binder qu'une seule texture (donc appel à glActiveTexture (GL_TEXTURE0)). Si je bind même qu'une seule texture sur l'unité 1, ça ne fonctionne plus. Si j'en bind 2, une sur l'unité 0 et l'autre sur l'unité 1, plus aucune ne fonctionne.
J'ai pourtant l'impression que le code est correct...