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