OpenGL ES 2.0, указывающий атрибут позиции vec3 или vec4 - PullRequest
7 голосов
/ 18 декабря 2011

Во введении OpenGL ES 2.0 можно найти здесь: http://www.webreference.com/programming/opengl_es/2.html определен вершинный шейдер:

GLbyte vShaderStr[] =
   "attribute vec4 vPosition;   \n"
   "void main()                 \n"
   "{                           \n"
   "   gl_Position = vPosition; \n"
   "};                          \n";

Атрибут vPosition является четырехкомпонентным вектором.

Позже в тексте приложение скомпилирует вершинный шейдер вместе с фрагментным шейдером. С помощью glBindAttribLocation устанавливается дескриптор для передачи вершинных данных приложений в шейдер:

// Bind vPosition to attribute 0
glBindAttribLocation(programObject, 0, "vPosition");

Теперь 2 шейдера связаны, и программа готова к использованию.

Вариант использования: 1013 *

GLfloat vVertices[] = {0.0f, 0.5f, 0.0f,
                        -0.5f, -0.5f, 0.0f,
                        0.5f, -0.5f, 0.0f};
...
// Load the vertex data
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 3);

Что означает:

  • glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices): передать данные вершин в программу, использовать местоположение 0, каждая вершина имеет 3 компонента, тип float, нормализация не используется.

  • glEnableVertexAttribArray(0): Шейдер будет использовать переданные данные.

  • glDrawArrays(GL_TRIANGLES, 0, 3);: Шейдер выполнит код для рисования одного треугольника, используя первые (и только) три вершины, найденные в указанном массиве.

Мои вопросы:

  • Вершинный шейдер ожидает четырехкомпонентную позицию вершины (x, y, z, w), программа передает только три компонента (x, y, z) данных Почему это работает?

  • Шейдеру нужен vec4, w-компонент должен быть равен 1, чтобы работать как положено. Какой шаг отвечает за правильное добавление w-компонента?

1 Ответ

18 голосов
/ 18 декабря 2011

См. Этот ответ: Можно ли использовать glVertexAttribPointer, чтобы назначить меньший вектор большему?

Как уже упоминалось в этом посте, оно указано в спецификации gles: http://www.khronos.org/registry/gles/specs/2.0/es_full_spec_2.0.24.pdf
В разделе 2.8 этого документа говорится:

Когда элемент массива i передается в GL с помощью DrawArrays или DrawElements команды, каждый общий атрибут расширяется до четырех компоненты. Если размер равен единице, то компонент x атрибута определяется массивом; компоненты y, z и w неявно установлены в ноль, ноль и один, соответственно. Если размер два, то х и у компоненты атрибута определяются массивом; Z и W компоненты неявно установлены на ноль и один, соответственно. Если размер равен трем, тогда x, y и z определены, а w неявно установлено в один. Если размер равен четырем, то указываются все компоненты.

...