OpenGL ES 2.0 спецификация атрибута позиции vec3 или vec4

Во введении 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");

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

Пример использования следующий:

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-компонента?

7
задан Jon Egerton 18 December 2011 в 15:22
поделиться