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.
También debe publicar el sombreador. –
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
Traté de cambiar el nombre del uniforme a "myTexture", pero el resultado es el mismo, desafortunadamente. – fescrb