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