2012-02-21 20 views
5

Estoy usando OpenGL y GLSL para dibujar una textura sobre una malla simple.glUniform no puede establecer el valor de muestra

Mi problema es que cuando estoy usando glUniform1i para establecer el valor de un sampler2D uniforme, no se configuró. Por ejemplo en el en este código:

glUseProgram(programObject); 

glUniform1i(glGetUniformLocation(programObject, "texture"), 1); 
GLint val; 
glGetUniformiv(programObject, 
       glGetUniformLocation(programObject, "texture"), 
       &val); 
printf("Value is %d\n", val); 

El valor impreso en la línea de comandos de salida es 0. He comprobado que los shaders se compilan correctamente y el programa está vinculado correctamente. glGetUniformLocation muestra un índice> 0. Además, glGetError no genera ningún error en ningún momento.

Esto solo ocurre cuando el uniforme es una muestra. Como la textura no está configurada, la búsqueda en el sombreador siempre regresa (0, 0, 0, 1). (También he comprobado, usando apitrace, que mi textura está correctamente vinculada al GL_TEXTURE1, que se realiza inmediatamente después del código que se muestra).

He buscado extensivamente este problema y solo he encontrado una instancia de algo similar a este here. La solución fue inicializar GLEW, pero esto no funcionó para mí.

Me complace proporcionar cualquier información extendida necesaria (o la huella de apitrace).

Editar

Aquí es el shader:

uniform sampler2D texture; 

varying vec2 textureCoord; 

void main() { 
    gl_FragColor = texture2D(texture, textureCoord); 
} 

Solución

logré resolver el problema después de algún trabajo.

Como resultado, este problema no se debió a que no se estableciera el uniforme, ya que siempre devolver 0 a los muestreadores independientemente del valor real parece ser una peculiaridad de la implementación de gl. Esto sucedió solo bajo el controlador de Intel para Sandy Bridge. Probar el código bajo otras implementaciones siempre devolvió el valor de muestra correcto.

El problema del retorno de la textura (0, 0, 0, 1) siempre se debió a un error que cometí durante la generación de la textura.

Ahora el glGerUniformiv aún devuelve 0, pero la textura utilizada es la correcta.

+0

También debe publicar el sombreador. –

+2

Ha intentado nombrarlo de otra manera (la textura también es una función GLSL incorporada, aunque técnicamente no es una palabra clave, no le garantizo que esto funcionará). – KillianDS

+0

Traté de cambiar el nombre del uniforme a "myTexture", pero el resultado es el mismo, desafortunadamente. – fescrb

Respuesta

3

Solución

me las arreglé para resolver el problema después de algún trabajo.

Como resultado, este problema no se debió a que no se estableciera el uniforme, ya que siempre devolver 0 a los muestreadores independientemente del valor real parece ser una peculiaridad de la implementación de gl. Esto sucedió solo bajo el controlador de Intel para Sandy Bridge. Probar el código bajo otras implementaciones siempre devolvió el valor de muestra correcto.

El problema del retorno de la textura (0, 0, 0, 1) siempre se debió a un error que cometí durante la generación de la textura.

Ahora glGerUniformiv aún devuelve 0, pero la textura utilizada es la correcta.

Cuestiones relacionadas