OPENGL ARB_occlusion_query Отбор окклюзии
for (int i = 0; i < Number_Of_queries; i++)
{
glBeginQueryARB(GL_SAMPLES_PASSED_ARB, queries[i]);
Box[i]
glEndQueryARB(GL_SAMPLES_PASSED_ARB);
}
Мне любопытно, какой метод предложен в GPU GEMS 1 для отбора окклюзии, когда выполняется определенное количество запросов. Используя описанный метод, вы не можете проверить отдельные блоки друг против друга, поэтому вы должны делать следующее?
Тест Box A -> Визуализация Box A
Тест Box B -> Визуализация Box B
Тестовое окно C -> Render Box C
и так далее...
2 ответа
Я не уверен, правильно ли я вас понимаю, но разве это не один из недостатков наивной реализации: сначала отрисовывать все блоки (а не записывать в буфер глубины), а затем использовать результаты запроса для проверки каждого объекта? Но ваше предложение немедленно использовать результат запроса для одного окна - еще более наивный подход, так как это останавливает конвейер. Если вы прочитаете эту главу (предполагая, что вы обратитесь к главе 29) дальше, они представят простую технику, позволяющую преодолеть недостатки обоих наивных подходов (то есть просто отобразить все как обычно и использовать результаты запроса предыдущего кадра).
Я думаю (было бы неплохо связать статью о гемах GPU...), вы запутались в несколько асинхронных запросах, описанных в следующих расширениях:
http://developer.download.nvidia.com/opengl/specs/GL_NV_conditional_render.txt
Если я правильно помню, были другие расширения, чтобы проверить наличие результата без блокировки также.
Как указывает Кристиан Рау, выполнение только "запроса, ожидания результата, выполнения чего-либо на основе результата" может привести к сбою и может не принести никакой выгоды, в зависимости от того, сколько работы выполняется в "выполнении какого-либо действия". Фактически, выполнение запроса, ожидание его прохождения туда и обратно только для сохранения одного вызова отрисовки, скорее всего, не поможет вообще.