1.7.7. Операции над фрагментами
После предварительной обработки над фрагментами выполняется еще ряд просты х операций, называемых фрагментнъши операциями. К ним относятся проверка на видимость, отсечение по прямоугольнику (прямоугольник устанавливается функцией gl Scissor), проверка прозрачности (используется значение прозрачности фрагмента и правило, установленное функцией gl АТ phaFunc), отсечение по ишбло-ну (для сравнения шаблона и фрагмента существуют функции glStenci 1 Func и glStenci 10р), проверка глубины (функция glDepthFunc сравнивает глубину обрабатываемого фрагмента с глубиной из кадрового буфера), шешеиие (окончательный цвет для записи в кадровый буфер определяется как сочетание цвета фрагмента, базового цвета из кадрового буфера с использованием правил смешивания, устанавливаемых функциями gl BlendFunc, gl BlendColor и glBl endEquatnon), сглаживание и логические операции (наложение окончательного значения фрагмента на значение из кадрового буфера с. использованием логической операции, установленной функцией gl LogicOp).
Все эти операции не зависят от других и могут быть эффективно и дешево выполнены с использованием аппаратного обеспечения. Некоторые из них подразумевают обращение к буферу кадров за значениями цвета, глубины или шаблона. Несмотря на вызванное этим замедление работы, на современных графических ускорителях все операции последнего этапа визуализации могут выполняться со скоростью миллион пикселов в секунду.
1.7.8. Операции с буфером кадров
Операции с буфером кадров контролируют буфер в целом (см. рис. 1.1, 9). Посредством выбора состояний OpenGL можно влиять на ту часть буфера кадров, в которую будут нарисованы примитивы. Буфер назначения рендеринга обычно надо выбирать, так как OpenGL работает и со стереоизображениями, и с двойной буферизацией. Части буфера кадров также называются буферами: первичный, вторичный, левый, правый, первичный левый, первичный правый, вторичный левый, вторичный правый и первично-вторичный. Рендеринг можно перенаправить в любой из этих буферов с помощью функции glDrawBuffer. Некоторые части внутри буфера или буферов можно защищать от записи.
Режим записи или чтения различных компонентов буфера назначения - красного, зеленого, синего, уровня прозрачности - устанавливается функцией gl Col orMask. Разрешить или запретить запись глубины позволяет функция glDepthMask. Изменять режим записи в буфер шаблона можно функцией gl Stencil Mask. Можно также очистить (инициализировать заново) все основные значения в буфере кадров, вызвав функцию gl Cl ear. Отдельные компоненты - цвет, глубина, шаблон, буфер накопления - инициализируются соответствующими функциями: glClearColor, glClearDeptb, glClearStenci 1 и glClearAccum. Затем функцией glAccumустанавливается операция накопительного буфера.
Из соображений улучшения производительности реализации OpenGL прибегают к различным способам буферизации для того, чтобы отправлять на аппаратную обработку группы графических примитивов большего размера. Чтобы ускорить завершение рисования графических примитивов для конкретного контекста рендеринга, приложение должно вызвать функцию gl Flush. Чтобы удостовериться в том, что рендеринг завершен для всех примитивов контекста, приложение вызывает функцию glFini sh. Эта команда блокирует дальнейшую работу и ожидает окончания выполнения всех предыдущих команд. При этом страдает скорость работы в целом, так что использовать эти функции необходимо осторожно.