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

К любому фрагменту шейдер может применить ключевое слово di scard, чтобы сразу отбросить его.

Если при рисовании применяется буфер глубины, а шейдер не вычисляет gl_FragDepth, глубина вычисляется с помощью стандартных операций. При обработке фрагмента шейдер записывает значение глубины для текущего фрагмента в gl_FragDepth. После того как фрагментный шейдер завершится, это значение будет приведено к значению из диапазона [0,1 ] и к форме представления числа с фиксированной запятой с таким количеством бит, чтобы соответствовать размеру буфера кадров.

Разработчик шейдера должен позаботиться о том, чтобы переменная gl^Frag-Depth заполнялась при любом варианте прохождения выполняемых ветвей кода, иначе при некоторых условиях значение gl_FragDepth останется неопределенным.

Нет гарантии, что шейдер вычислит значение глубины точно так же, как это делают обычные OpenGL-операции, которые он замещает. Значение может отличаться даже в том случае, если оно просто копируется из gl_FragCoord .z в gl _Frag-Depth. Только инвариантность глубины гарантирует, что фрагментные шейдеры будут вычислять глубину так же, как это делается в стандартных операциях.

Значения, записываемые в gl_FragCol or и gl_FragDepth, не усекаются шейдером, но могут быть приведены позже к значению из диапазона, приемлемого для буфера, в который записывается фрагмент.

Если шейдер выполняет дай фрагмента di sea rd, фрагмент отбрасывается, a gl _F rag -Depth и g1_FragColor становятся не нужны.

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

vec4 gl_FragColor;

float gl_FragDepth:

4.3. Встроенные uniform-переменные

OpenGL спроектирован как конечный автомат. Существует много состояний, в которые его можно устанавливать. Когда графические примитивы передаются в OpenGL для рендеринга, их обработка зависит от текущих установок OpenGL.

Некоторые приложения используют такие возможности OpenGL в большом объеме, и большое количество кода манипулирует состоянием OpenGL, что позволяет добиться различных эффектов визуализиции.

Язык шейдеров OpenGL облегчает таким приложениям программирование графических операций. В нем есть множество встроенных uniform-i 1 еременных, из которых шейдер может получать текущее состояние OpenGL. Таким образом, приложение продолжает использовать OpenGL как управляющий конечный автомат и использует шейдеры для чтения этого состояния, чтобы обрабатывать графическую информацию способами, отличающимися от стандартных операций. Так как переменные объявлены как uniform, шейдеры могут считывать из них значения, но не могут их изменить.


⇐ вернуться назад | | далее ⇒