Occlusion Query (Запрос на перекрытие)
Occlusion Query (запрос на перекрытие) — подсчёт количества фрагментов выводимого объекта (или группы объектов), прошедших тест глубины.
Используется для проверки видимости объектов на видеокартах, поддерживающие Occlusion Query хардварно. Если количество фрагментов равно нулю, то объект не виден (перекрыт другой геометрией), и его можно отбросить. Такое отсечение невидимой геометрии называется Occlusion culling.
В компьютерной графике часто требуется узнать, виден ли объект на экране, для того чтобы не рисовать его и не тратить ресурсы видеокарты зря. Для решения задачи отсечения невидимой геометрии используют различные техники, как например, Frustum Culling, PVS (Potentially Visible Sets), порталы и т.п. Эти решения хороши, и позволяют отбросить большое количество невидимых объектов, но, например, для PVS нужно делать предрасчёт видимости (а в реальном времени расчёт практически невозможен), а порталы чаще всего приходится расставлять вручную, что неудобно. Поэтому с теми объектами, которые находятся внутри пирамиды видимости, но перекрыты другими, остаются проблемы определения видимости, в особенности, если они являются динамическими.
Для решения этих проблем довольно давно было введена возможность запросить у видеокарты количество фрагментов объекта или группы объектов, которые были отрисованы. Поддержка этой возможности начинается с видеокарт Radeon 7000 и GeForce 3. Occlusion Query позволяет узнать, сколько в точности фрагментов объекта было нарисовано (не путать с «сколько фрагментов объекта видно после окончания отрисовки кадра»!), что позволяет не только отбросить объект, когда количество фрагментов равно нулю, но и применять другие действия, учитывая эти данные.
Occlusion query можно также использовать для других интересных задач, в том числе и в [[GPGPU]]. Можно, например, определить, сколько пикселей имеют определённую яркость, или сколько пикселей при отрисовке используют определенный mip уровень текстуры.
В OpenGL есть пара расширений, которые разделяют эту функциональность, но стоит отметить только официальное ARB_occlusion_query. В этом расширении используется Query object с параметром GL_SAMPLES_PASSED.
В DirectX эта возможность доступна через IDirect3DQuery9 интерфейс с типом D3DQUERYTYPE_OCCLUSION.
Важно отметить, что получить результат проверки можно только тогда, когда тот готов. Иначе при запросе нам придется ждать, пока видеокарта закончит свою работу (CPU простаивает), а потом пока к нам приходит результат проверки, и мы решаем, что делать дальше, у нас стоит GPU (GPUStall). Для избежания этого следует делать запрос на получение результата как можно позже, в таком случае мы, скорее всего, получим результат, когда тот действительно готов. Также полезно вводить иерархические проверки для уменьшения количества запросов, и пытаться использовать системы предсказания результата, которые описаны, к примеру, в статье №6 книги GPU Gems 2 «Harware occlusion query's made useful».
Ссылки:
Статья на gamedev.net про использование IDirect3DQuery9
На этой странице есть пример использования Occlusion Query в OpenGL
Что такое Occlusion Query (Запрос на перекрытие)?
#Direct3D, #occlusion, #OpenGL, #отсечение невидимой геометрии
27 марта 2007 (Обновление: 16 июня 2009)