name initial icon content capable apple app iphone ios opengl-es shader

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 ?).