изменить цвет вершины в вершинном шейдере - PullRequest
4 голосов
/ 31 марта 2010

Можно ли установить цвет одной вершины, используя программу вершинного шейдера GLSL, так же, как gl_Position меняет положение вершины?

1 Ответ

9 голосов
/ 31 марта 2010

Для версий GLSL более ранней версии 1.30 вы хотите записать во встроенные модули gl_FrontColor или gl_BackColor, которые доступны в вершинном шейдере. Прочитайте об изменениях в спецификации GLSL 1.10 (http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.10.59.pdf), чтобы узнать больше о них, или в спецификации расширения GL_ARB_vertex_shader.

gl_FrontColor и gl_BackColor - векторы 4D RGBA, которые принимают нормализованные скаляры с плавающей запятой.

Но это установит все вершины на красный, а не только на одну вершину. Это потому, что один и тот же вершинный шейдер запускается для всех вершин. Если вы хотите установить отдельные цвета, используйте glColorPointer вместе с glDrawArrays, glDrawElements, glDrawRangeElements или glMultiDrawElements. Цвет вершины, установленный glColorPointer, можно прочитать как gl_Color в вершинном шейдере. gl_Color в вершинном шейдере является атрибутом для каждой вершины.

Чтобы прочитать цвет, который вы написали в вершинном шейдере, во фрагментном шейдере прочитайте встроенную переменную gl_Color. Готовые фрагменты должны быть записаны в gl_FragColor.

Пример вершинного шейдера:

void main()
{
    gl_FrontColor = gl_Color;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

Пример фрагмента шейдера:

void main()
{
    gl_FragColor = gl_Color;
}

Кроме того, чтобы вершинный шейдер устанавливал изменения так же, как конвейер фиксированной функции OpenGL, вызовите функцию ftransform ().

void main()
{
    ftransform();
}
...