Я только начал изучать вопросы окклюзионных запросов в OpenGL, но меня немного смущает, как они на самом деле работают.
В большинстве примеров, которые я обнаружил, маски глубины и цвета деактивируются перед рисованием с помощью запроса окклюзии (потому что нам не нужно ничего «рисовать»), по сути, примерно так:
glDepthMask(GL_FALSE);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glBeginQuery(GL_ANY_SAMPLES_PASSED,query1);
// Draw Object 1
glEndQuery(GL_ANY_SAMPLES_PASSED);
glBeginQuery(GL_ANY_SAMPLES_PASSED,query2);
// Draw Object 2
glEndQuery(GL_ANY_SAMPLES_PASSED);
// etc
glDepthMask(GL_TRUE);
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
(Предполагается, что объекты рисуются спереди назад, поэтому объект 1 находится перед объектом 2. Приведенный выше код является просто псевдокодом для ответа на этот вопрос. Результат запросов будет получен позднее.)
Теперь, чтобы узнать, действительно ли объект 2 перекрыт объектом 1, нужно как-то сохранить информацию фрагмента из запроса 1 (я предполагаю, что в каком-то буфере глубины). Но мы отключили рисование в буфере глубины и цвета, что означает, что ничто не нарисовано, что означает, что оно не должно ничего хранить?
Есть ли специальный буфер запроса? Если так, есть ли способ получить к нему доступ? Это каким-либо образом связано с текущим связанным текстурным или кадровым буфером? Нужно ли это очистить? Я неправильно понимаю, как на самом деле работают окклюзионные запросы?
Теперь, чтобы узнать, действительно ли объект 2 перекрыт объектом 1, нужно как-то сохранить информацию фрагмента из запроса 1
С чего бы это? Запросы окклюзии хранят счетчик количества образцов, прошедших тест глубины, который представляет собой одно целое число.
Поскольку вы отключили запись в буфер цвета и глубины, рисование объектов будет выполняться только путем увеличения счетчика запросов окклюзии *. Объект 2 не может перекрывать объект 1, потому что рисованный объект 1 не изменяет буфер глубины.
* Если у вас нет буфера трафарета или вы делаете что-то вроде загрузки / сохранения изображения в шейдерах