Кажется, сложно найти информацию о том, как получить доступ к буферам глубины и трафарета в шейдерах последовательных проходов рендеринга.
На первом проходе рендеринга я не только визуализирую информацию о цвете и глубине, но также использую операции трафарета для подсчета объектов. Для этого я использую мульти-рендер FBO с цветными буферами и комбинированным буфером трафарета глубины. Все они представлены в виде текстур (объекты буфера рендеринга не задействованы).
Во втором проходе рендеринга (при рендеринге на экран) я хочу получить доступ к ранее вычисленному индексу трафарета на попиксельной основе (но не обязательно к тому же пикселю, который я рисую тогда), аналогично тому, как вы хотели бы получить доступ к предварительно обработанный буфер цвета для применения некоторого эффекта постобработки.
Но мне не удалось привязать текстуру трафарета глубины во втором проходе к моей программе шейдера как к униформе. По крайней мере, из него считываются только черные значения, поэтому я предполагаю, что он привязан неправильно.
Можно ли привязать текстуру трафарета глубины к блоку текстуры для использования в программе шейдера? Невозможно получить доступ к глубине и текстурам трафарета с помощью "обычных" сэмплеров? Возможно ли это с каким-то "специальным" сэмплером? Зависит ли это от режима интерполяции, установленного на текстуре или аналогичных настроек?
Если нет, то каков наилучший (самый быстрый) способ скопировать информацию о трафарете в отдельную цветовую текстуру между этими двумя проходами рендеринга? Может быть, задействован третий проход рендеринга, который рисует один цвет с использованием теста трафарета (мне нужна только двоичная версия буфера трафарета на последнем проходе рендеринга, чтобы быть точным, мне нужно проверить, равно ли значение нулю ).
Настройка текстур, используемых промежуточным FBO, следующая:
// The textures for color information (GL_COLOR_ATTACHMENT*):
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
// The texture for depth and stencil information (GL_DEPTH_STENCIL_ATTACHMENT*):
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, w, h, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0);
Во втором проходе рендеринга я сейчас пытаюсь только «отладить» содержимое всех текстур. Поэтому я устанавливаю шейдер со следующими значениями:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, <texture>);
glUniform1i(texLocation, 0);
и пусть программа шейдера просто скопирует текстуру на экран:
uniform sampler2D tex;
in vec2 texCoord;
out vec4 fragColor;
void main() {
fragColor = texture2D(tex, texCoord);
}
Результаты следующие:
Когда
<texture>
выше относится к одной из моих цветовых текстур, я вижу вывод цвета, отображаемый на первом проходе рендеринга, чего я и ожидал.Когда
<texture>
выше относится к текстуре трафарета глубины, шейдер ничего не делает (я вижу цвет, которым очищаю экран).При копировании текстуры трафарета глубины в ЦП и ее изучении я вижу информацию о глубине и трафарете в упакованных 24 + 8-битных данных, как и ожидалось.