Як я можу виявити в OpenGL діапазон глибини буфера глибини?


11

Я роблю додаток для багатопрохідного відтворення GL для iOS. Перший прохід надає текстуру буфера глибини. Другий прохід використовує значення в буфері глибини для управління застосуванням фрагмента шейдера. Я хочу змінити масштаби значень у буфері глибини на щось корисне, але перш ніж я можу це зробити, мені потрібно знати діапазон значень глибини значень буфера глибини. Як це зробити?

Відповіді:


10

Діапазон значень, записаних у буфер глибини, є тим, яким ви їх хочете. Зазвичай вони потрапляють в діапазон від 0 до 1. Фактичне значення, яке записується в буфер глибини, обчислюється під час перетворення вікна перегляду, виходячи із значення Z вершини в просторі NDC (після розділення точки перспективи на w у просторі кліпу).

Значення глибини NDC (Z, після поділу точки на перспективу на W) масштабується по частині глибини трансформації вікна перегляду (яка приносить ваші координати X і Y в простір координат, який ви будете асоціювати з пікселями у вікні), а потім масштабується на (2^n-1)- це означає, що слід читати як "два на потужність n" - nце бітова точність буфера глибини. Отримане значення записується в буфер глибини.

OpenGL розбиває визначення матриці перетворення візуального вікна на виклики glViewport та glDepthRange . glDepthRange - це те, що контролює коефіцієнт масштабу, відповідальний за визначення діапазону глибини, про який ви запитуєте. Ви можете зателефонувати glGetFloatv за допомогою GL_DEPTH_RANGEселектора, щоб відновити поточний діапазон. Це дозволить вам використовувати діапазон, не вважаючи, що це 0 до 1 (хоча 99,9% часу, на практиці, його ніхто ніколи не змінює).

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


Я дам цей Джош для всіх студійних додаткових довідкових матеріалів та підказки про трикутникові планарності. Я схильний робити хак, де розташовані позиції поблизу / далеких площин кліпу, щоб точно відповідати z-мірі геометрії, яку я передаваю, так що карта глибини має приємні значення. Що мені робити? Я хочу створити цікаві ефекти для розмиття для конкретного місця розташування під час проходу №2 на основі того, що коли-небудь є на карті глибини проходу №1.
дугла

7

Значення буфера глибини завжди знаходяться в межах від 0-1. Нульовим є те, що виведений фрагмент знаходиться в глибині близької площини, а 1 - фрагмент знаходиться в глибині далекої площини. І все між цим.

Якщо ви хочете знати реальну глибину у світовому просторі, легко її обчислити з глибини буфера.

depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;

Ось чому ви вказуєте найближчі та далекі площини у вашій матриці проекцій, щоб отримати більшу точність буфера глибини.

Також слід пам’ятати про різницю між глибиною та відстані при використанні буферних значень глибини.


@notebene. Майже там. Я хочу змінити масштаб діапазону значень у dubbuffer, який дорівнюватиме 0 -> 1. Отже, якщо відображені min / max значення значень глибини - .25 / .75, я хочу (valuevalue - .25) / (. 75 - .25). Отже, чи є спосіб виявити хв / макс глибинного буфера після проходу 1 і використати його для зміни шкали під час проходу 2.
дугла

1
@dugla: оскільки ви рендеруєте трикутники, які є площинними, то виконання мінімальних і максимальних значень глибини буде пов'язано з мінімальною і максимальною вершинами в сцені. Якщо ви знаєте цих двох, ви можете вручну перетворити їх на всьому протязі трубопроводу, і ви будете знати мінімальні та максимальні значення, які ви записували б у буфер глибини. Це можливо простіше, ніж візуалізація, тоді зчитування всього буфера глибини та повторення.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.