Подтвердить что ты не робот

Какова связь между gl_Color и gl_FrontColor как в вершинных, так и в фрагментарных шейдерах

У меня есть проходные вершинные и фрагментарные шейдеры.

vertex shader

void main(void)
{
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

фрагментарный шейдер

void main(void)
{
    gl_FragColor = gl_Color;
}

Те производят пустой рендеринг (черный цвет не такой как glClearBuffer).

Если я модифицирую вершинный шейдер, чтобы установить gl_FrontColor в gl_Color, он отображает нетронутый буфер OpenGl... с ожидаемым поведением сквозных шейдеров.

void main(void)
{
    gl_FrontColor = gl_Color; //Added line
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

Я смущен, как настройки gl_FrontColor в вершинном шейдере могут изменить значение gl_Color во фрагменте? Что мне не хватает?

4b9b3361

Ответ 1

gl_Color означает разные вещи в разных местах.

В вершинном шейдере gl_Color представляет первичный атрибут цвета per-vertex, переданный пользователем. Это устанавливается с помощью glColor* вызовов или данных массива, полученных с помощью glColorPointer.

В шейдере фрагмента gl_Color представляет интерполированный цвет для облицовки отображаемого треугольника. Помните, что треугольники имеют переднюю грань и заднюю поверхность. Если вы включаете удаление лица, тогда все грани одного или другого (или обоих) не отображаются. Однако, если вы отключите отбрасывание лица, тогда обе стороны будут отображаться.

Часто бывает полезно иметь разные выходные значения на вершине, основанные на особой стороне треугольника. Основной цвет имеет передний цвет и задний цвет, представляющий цвет передних треугольников и обратных треугольников. Выходы вершинного шейдера для них: gl_FrontColor и gl_BackColor.

Если вы делаете двусторонний рендеринг, вам нужно будет установить оба этих значения, чтобы входной фрагмент gl_Color был чем-то значимым. Если вы выполняете только визуализацию на лицевой панели, вам нужно установить gl_FrontColor.

Ответ 2

gl_Color - это цвет, который вы передали в своем источнике в вершины, поэтому это атрибут. gl_FrontColor (а также BackColor) - это перемены, которые устанавливают gl_Color в fragmentshader в зависимости от того, какую сторону примитива вы видите. Итак, если вы видите, что передний gl_Color будет равен gl_FrontColor...