В 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.
dugla

7

Значения в буфере глубины всегда находятся в диапазоне от 0-1. Ноль - то, что предоставленный фрагмент находится в глубине ближней плоскости, а 1 - то, что фрагмент находится в глубине дальней плоскости. И все между этим.

Если вы хотите узнать реальную глубину в мировом пространстве, ее легко вычислить из буфера глубины.

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

И именно поэтому вы указываете ближнюю и дальнюю плоскости в проекционной матрице, чтобы повысить точность буфера глубины.

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


@notebene. Почти готово. Я хочу, чтобы масштабирование диапазона значений в буфере глубины было точно равно 0 -> 1. Поэтому, если минимальные / максимальные значения рендеринга составляют .25 / .75, я хочу (значение глубины - .25) / (. 75 - .25). Итак, есть ли способ обнаружить мин / макс глубинного буфера после прохода 1 и использовать его для перемасштабирования во время прохода 2.
dugla

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