OpenGL ES 2.0 - не удается найти атрибут в вершинном шейдере - PullRequest
1 голос
/ 26 августа 2011

Я некоторое время искал ответ на этот вопрос, но мне не очень повезло.Все, что я пытаюсь сделать, это передать мои обычные данные в мой вершинный шейдер.Позиции проходят корректно, однако я получаю сообщение об ошибке «Обычный атрибут не найден» при попытке загрузить мои шейдеры.

Мои значения ATTRIB являются перечислениями.

Я создал кубв OpenGL ES 2.0 для разработки под Iphone.

Мой Shader.vsh выглядит так:

attribute vec4 normal;
attribute vec4 position;

varying vec4 colorVarying;

uniform mat4 mvp_matrix;

void main()
{
    //Trasform the vertex
    gl_Position = mvp_matrix * position;

    colorVarying = vec4(1.0, 1.0, 0.0, 0.0);
}

Часть, в которой я обновляю значения атрибутов в отрисовочном кадре, выглядит следующим образом:

// Update attribute values.
glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, 0, 0, cubeVerticesStrip);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_NORMAL, 3, GL_FLOAT, 0, 0, cubeNormalsStrip);
glEnableVertexAttribArray(ATTRIB_NORMAL);

И часть, где я их связываю в моей функции LoadShader, выглядит следующим образом:

glBindAttribLocation(program, ATTRIB_VERTEX, "position");
glBindAttribLocation(program, ATTRIB_NORMAL, "normal");

Опять же, позиция работает.Но «нормальный» не может быть найден.Есть идеи?

1 Ответ

10 голосов
/ 26 августа 2011

normal не найден, потому что ваш компилятор GLSL был умным. Он увидел, что вы на самом деле не сделали что-то с normal, поэтому он делает вид, что его не существует для экономии ресурсов.

Кроме того, ваше нормальное положение должно быть vec3, так как вы передаете только 3 значения. Это не обязательно, но это лучшая форма для согласования ваших входных данных и атрибутов.

...