Атрибут позиции vec3 или vec4 атрибута OpenGL ES 2.0

В предложении 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 шейдера теперь связаны и программа готова к использованию.

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

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

Solutions Collecting From Web of "Атрибут позиции vec3 или vec4 атрибута OpenGL ES 2.0"

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

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

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