initial - viewport iphone
glUniform4fv está dando GL_INVALID_OPERATION (1)
Estoy tratando de desarrollar un juego básico en iOS y OpenGL ES pero estoy atascado en este problema con los uniformes, aquí está el código que pasa el valor a mi uniforme:
glBindVertexArrayOES(_vertexArray);
// Render the object with ES2
glUseProgram(self.shaderProgram);
glUniformMatrix4fv(uniformModelViewProjection, 1, 0, modelViewProjectionMatrix.m);
// Get uniform center position
glUniform4fv(uniformCenterPosition, 1, centerPosition.v);
// Get uniform time position
glUniform1f(uniformTime, time);
// Set the sampler texture unit to 0
glUniform1i(uniformTexture, 0);
glDrawArrays(GL_POINTS, 0, numVertices);
Observe que se ha tenido cuidado al colocar la función glUniform precedida por glUseProgram y antes de que se realice la llamada a glDrawArrays. Las ubicaciones uniformes se ven bien también como se confirma a través del rastreo. Esto es lo que obtengo cuando ejecuto la herramienta OpenGL ES Analyzer en XCode:
Devuelve un GL_INVALID_OPERATION para glUniform4fv, observe que los valores representados parecen ser correctos.
Aquí están las posibles causas del error GL_INVALID_OPERATION que encontré en la documentation :
- no hay ningún objeto de programa actual.
- el tamaño de la variable uniforme declarada en el sombreador no coincide con el tamaño indicado por el comando glUniform.
- una de las variantes enteras con o sin signo de esta función se utiliza para cargar una variable uniforme de tipo float, vec2, vec3, vec4, o una matriz de éstas, o si se utiliza una de las variantes de punto flotante de esta función para cargar una variable uniforme de tipo int, ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4, o una matriz de estos.
- una de las variantes enteras con signo de esta función se utiliza para cargar una variable uniforme de tipo unsigned int, uvec2, uvec3, uvec4, o una matriz de estos.
- una de las variantes enteras sin signo de esta función se utiliza para cargar una variable uniforme de tipo int, ivec2, ivec3, ivec4 o una matriz de estos.
- location es una ubicación uniforme no válida para el objeto de programa actual y la ubicación no es igual a -1.
- count es mayor que 1 y la variable uniforme indicada no es una variable de matriz.
- un muestreador se carga con un comando que no sea glUniform1i y glUniform1iv.
Ninguno de ellos parece explicar por qué diablos estoy recibiendo este error. Me está volviendo loco, por favor ayuda!
Agregando mi comentario como respuesta, ya que resultó ser la solución:
Las únicas causas de esa lista que puedo imaginar son los puntos 2 y 3:
- el tamaño de la variable uniforme declarada en el sombreador no coincide con el tamaño indicado por el comando glUniform.
- una de las variantes enteras con o sin signo de esta función se utiliza para cargar una variable uniforme de tipo float, vec2, vec3, vec4, o una matriz de éstas, o si se utiliza una de las variantes de punto flotante de esta función para cargar una variable uniforme de tipo int, ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4, o una matriz de estos.
Así que asegúrese de que la variable uniforme correspondiente esté realmente declarada como vec4
en el sombreado (¿es posible que sea un vec3
?).