Подтвердить что ты не робот

GlUniform4fv дает GL_INVALID_OPERATION

Я пытаюсь разработать базовую игру в iOS и OpenGL ES, но я застрял в этой проблеме с униформой, вот код, который передает значение моей униформе:

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);

Обратите внимание, что для установки функции glUniform, предшествующей glUseProgram, и перед вызовом glDrawArrays, была предпринята осторожность. Единые местоположения также выглядят прекрасно, также подтверждается трассировкой. Вот что я получаю, когда запускаю инструмент анализатора OpenGL ES в XCode:

enter image description here

Он возвращает GL_INVALID_OPERATION для glUniform4fv, обратите внимание, что представленные значения кажутся правильными.

Вот возможные причины ошибки GL_INVALID_OPERATION, найденной в документации:

  • текущий программный объект отсутствует.
  • размер единообразной переменной, объявленной в шейдере, не соответствует размеру, указанному командой glUniform.
  • один из подписанных или беззнаковых целочисленных вариантов этой функции используется для загрузки единой переменной типа float, vec2, vec3, vec4 или массива из них или если один из вариантов с плавающей запятой этой функции используется для загрузки единой переменной типа int, ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4 или их массива.
  • один из подписанных целочисленных вариантов этой функции используется для загрузки единой переменной типа unsigned int, uvec2, uvec3, uvec4 или массива из них.
  • один из беззнаковых целочисленных вариантов этой функции используется для загрузки единой переменной типа int, ivec2, ivec3, ivec4 или массива из них.
  • location является недопустимым равномерным местоположением для текущего объекта программы, а местоположение не равно -1.
  • count больше 1, и указанная однородная переменная не является переменной массива.
  • сэмплер загружается с помощью команды, отличной от glUniform1i и glUniform1iv.

Никто из них, похоже, не объясняет, почему, черт возьми, я получаю эту ошибку. Это сводит меня с ума, пожалуйста, помогите!

4b9b3361

Ответ 1

Добавление комментария в качестве ответа, так как оказалось, что это решение:

Единственными причинами из этого списка, которые я мог представить, являются точки 2 и 3:

  • размер единообразной переменной, объявленной в шейдере, не соответствует размеру, указанному командой glUniform.
  • один из подписанных или беззнаковых целочисленных вариантов этой функции используется для загрузки единой переменной типа float, vec2, vec3, vec4 или массив из них, или если один из вариантов с плавающей запятой этого функция используется для загрузки единой переменной типа int, ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4 или массив из них.

Итак, убедитесь, что соответствующая равномерная переменная действительно объявлена ​​как vec4 в шейдере (возможно, это a vec3?).