Какова связь между gl_Color и gl_FrontColor в вершинных и фрагментных шейдерах - PullRequest
19 голосов
/ 21 июня 2011

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

вершинный шейдер

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 во фрагменте один? Чего мне не хватает?

Ответы [ 2 ]

33 голосов
/ 21 июня 2011

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

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

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

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

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

1 голос
/ 21 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...