2017-09-08 1 views
2

J'ai une application OpenGL très simple qui ne restitue qu'un seul quad texturé. Ceci est mon code, qui fonctionne très bien (le quad texturé apparaît très bien):La texture OpenGL est entièrement noire lorsqu'elle est rendue avec le shader

// Bind the test texture 
glBindTexture(GL_TEXTURE_2D, mTestTexture); 


// Draw the quad 
glBegin(GL_QUADS); 

glTexCoord2f(0.0f, 0.0f); 
glVertex3f(x, y + (float)height, 0.0f); 

glTexCoord2f(1.0f, 0.0f); 
glVertex3f(x + (float)width, y + (float)height, 0.0f); 

glTexCoord2f(1.0f, 1.0f); 
glVertex3f(x + (float)width, y, 0.0f); 

glTexCoord2f(0.0f, 1.0f); 
glVertex3f(x, y, 0.0f); 

glEnd(); 

Alors je voulais intoduce un shader simple. Donc, j'ai modifié mon code un peu:

// Use shader and point it to the right texture 
auto texLocation = glGetUniformLocation(mProgram, "tex"); 
glUseProgram(mProgram); 
glUniform1i(texLocation, mTestTexture); 

// Draw the quad 
// Same drawing code as before... 

Vertex shader:

void main(void) 
{ 
gl_Position  = ftransform(); 
gl_TexCoord[0] = gl_MultiTexCoord0; 
} 

shader Fragment:

uniform sampler2D tex; 

void main() 
{ 
    vec4 color = texture2D(tex, gl_TexCoord[0].st); 
    gl_FragColor = color; 
} 

Maintenant, tout ce que je reçois est un quad noir :-(

J'ai déjà essayé et testé beaucoup de choses:

  • Les shaders fines (compilent pas d'erreur)
  • Le quad est visible (vertex shader semble OK)
  • Si je change le shader pour produire une couleur fixe ("gl_FragColor = vec4 (1,0, 0,1); ") mon quad devient rouge -> fragment shader fait quelque chose!
  • glGetError() ne renvoie pas d'erreur
  • Mon texLocation, MPROGRAM et mTestTexture semblent tous être d'identité valides

Est-ce que quelqu'un a une idée pourquoi je ne vais pas voir ma texture lors de l'utilisation du shader?

+1

Modifier dans un [mcve]. – genpfault

Répondre

4
glUniform1i(texLocation, mTestTexture); 
         ^^^^^^^^^^^^ texture object 

unité de texture index sont liés à des échantillonneurs, pas des objets de texture.

unité texture Utiliser zéro à la place:

glUniform1i(texLocation, 0);