Фрагментный шейдер получает gl_Color
и gl_SecondaryColor
в качестве атрибутов вершины. Он также получает четыре переменных: gl_FrontColor
, gl_FrontSecondaryColor
, gl_BackColor
и gl_BackSecondaryColor
, в которые он может записывать значения. Если вы хотите передать исходные цвета прямо, вы должны сделать что-то вроде:
gl_FrontColor = gl_Color;
gl_FrontSecondaryColor = gl_SecondaryColor;
gl_BackColor = gl_Color;
gl_BackSecondaryColor = gl_SecondaryColor;
Фиксированная функциональность в конвейере, следующем за вершинным шейдером, затем закрепит их в диапазоне [0..1] и выяснит, является ли вершина лицевой или обратной. Затем он будет интерполировать выбранный (передний или задний) цвет, как обычно. Затем фрагментный шейдер получит выбранные фиксированные интерполированные цвета как gl_Color
и gl_SecondaryColor
.
Например, если вы нарисовали стандартный «треугольник смерти», например:
glBegin(GL_TRIANGLES);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(-1.0f, 0.0f, -1.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(1.0f, 0.0f, -1.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3d(0.0, -1.0, -1.0);
glEnd();
Тогда вершинный шейдер выглядит так:
void main(void) {
gl_Position = ftransform();
gl_FrontColor = gl_Color;
}
с фрагментным шейдером, подобным этому:
void main() {
gl_FragColor = gl_Color;
}
будет передавать цвета, как если бы вы использовали конвейер с фиксированной функциональностью.