Можно ли в том же вызове отрисовки провести тест глубины по текстуре глубины, которую я также отбираю?

Контекст:

Я использую установку отложенного рендеринга, где на первом этапе у меня есть два FBO: один - это GBuffer, для хранения нормалей, альбедо и информации о материалах для всех видимых фрагментов. Этот FBO имеет текстуру глубины 32 бита. Это втягивается в проход геометрии до того, как будет рассчитано какое-либо освещение.

Второй FBO предназначен только для цвета и начинается с черного, но накапливает освещение за несколько проходов от шейдеров освещения, которые выбирают из GBuffer и записывают в буфер только для цвета с использованием аддитивного смешивания.

Проблема в том, что я бы очень хотел использовать раннее тестирование глубины, чтобы мое освещение рассчитывалось ТОЛЬКО для фрагментов, содержащих фактическую геометрию (а не только небо). Наилучший способ, который я могу придумать для этого, - это использовать проверку глубины, чтобы вывести из строя любые пиксели, имеющие глубину, равную единице, в случае солнечного света, или вывести из строя любые пиксели, которые лежат за сферой влияния для точечных источников света. Однако я не думаю, что могу привязать эту текстуру глубины к моему цветному FBO, поскольку я также сэмплирую из нее внутри шейдера освещения для вычисления положения фрагментов в мировом пространстве.

Итак, мой вопрос: есть ли способ использовать одну и ту же текстуру глубины как для раннего теста глубины, так и для выборки внутри шейдера? Или, если нет, есть ли другой (достаточно эффективный) способ отклонения пикселей, в которых нет геометрии? Я вообще не буду писать текстуру глубины в моем проходе освещения.

Мне нужно ориентироваться только на современное графическое оборудование на ПК (поэтому я могу использовать любые распространенные расширения или функции openGL 4.6).


person Trevor Galivan    schedule 23.08.2020    source источник


Ответы (1)


В OpenGL есть правила чтения данных в шейдере, который также обновляется из-за операции фреймбуфера. Раньше эти правила были довольно строгими. Действительно, до GL 4.4 правила были такими строгими < / a> то, что вы пытаетесь сделать, на самом деле было неопределенным поведением. То есть, если изображение из текстуры было прикреплено к FBO рендеринга, и вы взяли образец из этой текстуры таким образом, что было вообще возможно читать из прикрепленного изображения, вы получил неопределенное поведение. Неважно, если ваша маска записи означает, что письма не было; это был УБ.

К счастью, теперь это четко определено. Вы получаете UB только в том случае, если выполняете фактическую запись, а не только потому, что у вас есть изображение, прикрепленное к FBO. И сейчас я имею в виду практически любое оборудование, произведенное за последние 10 лет. Хотя ARB_texture_barrier и GL 4.5 появились довольно недавно, их предшественник NV_texture_barrier на самом деле довольно старый . И несмотря на то, что это расширение NVIDIA по названию, оно было настолько широко реализовано, что доступен даже в реализациях MacOS.

person Nicol Bolas    schedule 23.08.2020