Карта глубины инициализируется значением 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 во фрагментном шейдере?