Истинные значения глубины с использованием OpenGL readPixels - PullRequest
4 голосов
/ 12 июля 2011

Я хотел бы получить буфер глубины из вида моей камеры для приложения 3D-фильтрации. В настоящее время я использую glReadPixels, чтобы получить компонент глубины. Вместо значений [0,1] мне нужны истинные значения для буфера глубины или истинное расстояние до камеры в мировых координатах.

Я пытался преобразовать значения глубины с помощью GL_DEPTH_BIAS и GL_DEPTH_SCALE, но это не сработало.

glReadPixels(0, 0, width_, height_, GL_DEPTH_COMPONENT, GL_FLOAT, depth_buffer);
glGetDoublev(GL_DEPTH_BIAS,  &depth_bias);  // Returns 0.0
glGetDoublev(GL_DEPTH_SCALE, &depth_scale); // Returns 1.0

Я понимаю, что это похоже на Получение истинного значения z из буфера глубины , но я бы хотел получить значения глубины в основную память, а не в шейдер.

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

Попробуйте использовать gluUnproject() после извлечения нормализованного значения глубины из Z-буфера, как и раньше.Вам потребуется указать матрицу вида модели, матрицу проекции и значения области просмотра, которые можно получить с помощью glGetDoublev() и glGetIntegerv().

2 голосов
/ 12 июля 2011

Вместо значений [0,1] мне нужны истинные значения для буфера глубины или истинное расстояние до камеры в мировых координатах.

Буфер глубины не содержит значений расстояния от камеры. Значения глубины представляют собой перпендикулярное расстояние до плоскости камеры. Поэтому, если вам действительно нужны радиальные расстояния до камеры, вам нужно вычислить их в шейдере и записать в буфер; буфер глубины не поможет.

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

Затем делайте то, что делают эти шейдеры, за исключением кода на C / C ++ (или чего-то еще), а не в шейдере. Математика одинакова в любом случае. Просто зациклите каждое значение в буфере глубины и преобразуйте его.

...