Настройка конвейера хода лицевые стороны, а при использовании значения GL_FRONT_AND_BACK отбрасываются обе стороны, что позволяет вообще отключить отображение фрагмента. Если в рассмотренной выше функции RenderO( ) перед выводом примитивов включить удаление невидимых сторон граней и вызвать gl Cul 1 Face(GL_BACK), то в левом окне, показанном на рис. 22.1, исчезнет нижняя пара треугольников, а при вызове gl Cul 1 Face(GL_FRONT) не будут нарисованы треугольники в верхней части окна.

По умолчанию лицевой считается грань с обходом вершин против часовой стрелки. Но признак лицевой грани можно изменить функцией gl FrontFace(Mode). Если параметром Mode передать константу GL_CW, то лицевыми будут считаться грани с обходом вершин по часовой стрелке. Константа GL_CCW восстанавливает состояние, заданное по умолчанию.

Удаление конкурирующих точек Рассмотренная выше функция RenderO( ) рисует две пересекающиеся грани. Но из двух граней мы видим не ближнюю к наблюдателю, а ту, что была нарисована последней. Библиотека обеспечивает удаление точек, заслоняемых более близкими к наблюдателю гранями. Для этого при инициализации создается Z-буфер, в конвейере включается выполнение теста глубины, а перед выводом изображения ячейки буфера заполняются значением 1.0, соответствующим значению Z-координаты дальней границы видимости.

Приложение не может отказаться от создания Z-буфера, но в поле cDepthBits структуры PIXELF0RMATDESCRIPT0R можно указать желаемую разрядность его ячеек.

Включение теста выполняется функцией gl Enable(GL_DEPTH_TEST). На рис. 22.1 в центре показано, как изменяется изображение при таком включении.

Благодаря тесту глубины графические библиотеки обеспечивают одинаковый результат независимо от порядка передачи примитивов в конвейер. В данном случае более удаленный объект всегда закрывается объектом, расположенным ближе к наблюдателю. Но виртуальный мир не обязательно следует законам физического мира. Конвейер можно настроить, например, так, чтобы из двух конкурирующих точек оставалась видимой точка, наиболее удаленная от наблюдателя. Для этого перед выводом примитивов необходимо вызвать функцию gl DepthFunc (GL_GREATER).


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