метод логарифмического буфера глубины c правильно интерполирует атрибут вершины? - PullRequest
0 голосов
/ 06 января 2020

Я читал о логарифмическом буфере глубины c. правильно ли он интерполирует атрибуты вершины? Я думал, что конвейер рендеринга идет по этому пути.

вершинный шейдер -> деление на w -> преобразование области просмотра -> интерполяция -> фрагментный шейдер

(Zclip)  ---------------- (Zndc)  ---------    (Zwindow)

Когда происходит интерполяция, растеризатор делает линейный интерполяция о Zwindow. Поскольку Zwindow пропорционально 1 / Zview, мы применяем перспективную интерполяцию для Zview с линейной интерполяцией для Zwindow.

Но в логарифмическом буфере глубины c они манипулируют значением z в вершинном шейдере. Это означает, что значения Zwindow больше не пропорциональны 1 / Zview и интерполяция растеризатора больше не является правильной.

Правильно ли я понимаю? что мне здесь не хватает?

1 Ответ

1 голос
/ 06 января 2020

правильно ли я понимаю?

Да.

что мне здесь не хватает?

Что за правильно рабочий логарифмический буфер глубины c, необходимо применить логарифм на фрагмент в шейдерном фрагменте.

Есть несколько способов приблизиться к этому:

  1. Вы не делаете используйте логарифм в вершинном шейдере, чтобы линейная интерполяция была правильной, и просто примените логарифмическое искажение c к фрагментному шейдеру. Этот подход, конечно, довольно глупый, потому что точность будет ограничена тем, что буфер глубины с плавающей запятой даст вам в любом случае, и так как большинство фрагментов попадет в интервал [0.5,1] в пространстве окна, вы в основном имеете фиксированную точность используя только одну экспоненту и пройдя логарифмическое пространство c после этого, вы не получите много.
  2. Вы пытаетесь "исправить" неправильно интерполированные значения в фрагментном шейдере, как в этой статье описывает подробно.
  3. Вы делаете вариант 1, просто не так глупо. Потеря точности в основном происходит при разрыве перспективы при переходе от пространства клипа к ND C (и снова при переходе в пространство окна). Вы можете просто передать значение eye space z на фрагментный шейдер (правильно интерполированный в правильной перспективе автоматически для вас с помощью графического процессора) и просто применить логарифм к , что во фрагментном шейдере.

Обратите внимание, что логарифмический буфер глубины c не очень хорошая идея, так как он требует изменения глубины для каждого фрагмента, так что вы теряете ранний тест глубины и все преимущества производительности, которые вы получаете от который. Существуют альтернативы, такие как обратный Z , которые не будут иметь таких недостатков.

...