PyOpenGL - получить карту глубины нарисованного изображения - PullRequest
0 голосов
/ 27 августа 2018

Я нарисовал конкретную сцену, используя с определенной точки зрения (используя матрицы просмотра и проекции).Я использовал VBO из треугольников и так один.Я могу получить RGB изображения, используя:

data = glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE)
data = np.frombuffer(data, dtype=np.uint8).reshape(width, height, 3)[::-1]
cv2.imwrite(r"c:\temp\image1.png", data)

Но получение карты глубины дает странный результат, состоящий в основном из 255:

data2 = glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE)
data2 = np.frombuffer(data2, dtype=np.uint8).reshape(width, height)[::-1]
cv2.imwrite(r"c:\temp\image2.png", data2)

Я попытался заменить GL_UNSIGNED_BYTE -> GL_FLOAT и uint8 -> float32

Но это не помогло

1 Ответ

0 голосов
/ 27 августа 2018

Карта глубины инициализируется значением 1,0, что приводит к 255, если она считывается в буфер GL_UNSIGNED_BYTE. Обратите внимание, что карта глубины находится в диапазоне [0.0, 1.0], если она читается как GL_UNSIGNED_BYTE, то этот диапазон отображается на [0, 255].

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

Если у вас есть значение глубины в диапазоне [0.0, 1.0], и вы хотите вычислить координату пространства (глаза) z , то вы должны преобразовать значение глубины в нормализованное устройство z Координатный кулак (z_ndc):

z_ndc = 2.0 * depth - 1.0;

Эта координата может быть преобразована в глазное пространство z координата (z_eye) по следующей формуле:

z_eye = 2.0 * n * f / (f + n - z_ndc * (f - n));

, где n - ближняя плоскость, а f - дальняя плоскость.

Обратите внимание, что это преобразование работает только для перспективной проекции.

При ортографической проекции координата z линейно отображается на глубину. Таким образом, обратное преобразование намного проще:

z_eye = depth * (f-n) + n; 

См. Также Как линейно визуализировать глубину в современном OpenGL с gl_FragCoord.z ​​во фрагментном шейдере?

...