Изменить значения z-буфера OpenGL

Я хочу передать матрицу со значениями глубины в z-буфер openGL.Где-то Я обнаружил, что я могу использовать glDrawPixels(640,480,GL_DEPTH_COMPONENT,GL_FLOAT,normalizedMappedDepthMat.ptr());

где mat — это opencv Mat. Можно ли изменить значения z-буфера в OpenGL, используя привязку текстуры? Если да, то как?

1

Решение

С помощью программируемого конвейера вы можете написать gl_FragCoord в фрагментном шейдере, эффективно устанавливая значение z для каждого пикселя. С помощью этой функции вы можете довольно легко реализовать функцию рендеринга в буфер глубины путем рендеринга полноэкранного четырехугольника (или чего-то еще, если вы хотите перезаписать только субрегион всего буфера). С достаточно современным GL вы сможете использовать форматы текстур с одним каналом с достаточной точностью, как GL_R32F. В более старых версиях GL вы можете вручную объединить каналы RGB или RGBA стандартных 8-битных текстур в 24 или 32-битные значения.

Однако есть некоторые мелкие детали, которые вы должны принять во внимание. Запись в буфер глубины происходит только в том случае, если GL_DEPTH_TEST включен. Это, конечно, может отбросить некоторые ваши фрагменты (если буфер глубины не очищен раньше). Один из способов обойти это установка glDepthFunc() в GL_ALWAYS во время рендеринга буфера глубины.

Вы также должны иметь в виду, что рендеринг пишет в все буферы, а не только буфер глубины. Если вы не хотите изменять цветовой буфер, вы можете установить glDrawBuffer() в GL_NONEили может использовать glColorMask() предотвратить перезапись. Если вы используете трафаретный буфер, вы, конечно, также должны отключить или замаскировать запись в него.

3

Другие решения


По вопросам рекламы [email protected]