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

Если я правильно помню, были другие расширения, чтобы проверить наличие результата без блокировки также.

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

Другие вопросы по тегам