Фрагментный шейдер может работать также с переменной gl _FrontFaci ng, которая обозначает принадлежность фрагмента к передней (true) или задней (false) грани. Если имитируется двухстороннее освещение, вершинный шейдер вычисляет два значения цвета, и в зависимости от gl_FrontFacing будет выбран один из этих цветов. Эти данные могут быть полезны также при задании разных способов затенения для передней или задней грани. Принадлежность фрагмента какому-либо виду грани зависит от примитива, из которого формируется фрагмент. Все фрагменты, созданные из примитивов, не являющихся многоугольниками, треугольниками или четырехугольниками, считаются расположенными на передней грани. Для всех других фрагментов (в том числе и созданных из точечных изображений или просто из отрезков) сначала проверяется знак координат примитива в оконном пространстве координат. В дальнейшем знак может быть изменен на противоположный в зависимости от того, каким был последний вызов gl FrontFace. Если знак положительный, фрагменты принадлежат передней грани; отрицательный - задней.

Переменные для входных данных находятся в глобальной области видимости, но могут быть доступны только из фрагментного шейдера. Объявлены они таким образом:

vec4 gl_FragCoord: boo! gl_FrontFacing:

4.2.4. Переменные для выходных данных Фрагментный шейдер должен вычислять значения для буфера кадров. Над выходными данными из фрагментного шейдера выполняется несколько окончательных

Программируемая часть операций OpenGL

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

Значение цвета, которое должно быть записано в буфер кадров (предполагается, что окончательные операции не изменят его), вычисляется фрагментным шей-дером и сохраняется во встроенной переменной gl_FragCol or. Большинство тендеров все-таки будут вычислять значение для gl^FragColor, но это не обязательно. Фрагментный шейдер должен записать лишь gl_FragDepth. Но если и последующие операции не вычислят gl_FragColor, результат окажется непредсказуемым.


⇐ Предыдущая| |Следующая ⇒