Я хочу передать матрицу со значениями глубины в z-буфер openGL.Где-то Я обнаружил, что я могу использовать glDrawPixels(640,480,GL_DEPTH_COMPONENT,GL_FLOAT,normalizedMappedDepthMat.ptr());
где mat — это opencv Mat. Можно ли изменить значения z-буфера в OpenGL, используя привязку текстуры? Если да, то как?
С помощью программируемого конвейера вы можете написать gl_FragCoord
в фрагментном шейдере, эффективно устанавливая значение z для каждого пикселя. С помощью этой функции вы можете довольно легко реализовать функцию рендеринга в буфер глубины путем рендеринга полноэкранного четырехугольника (или чего-то еще, если вы хотите перезаписать только субрегион всего буфера). С достаточно современным GL вы сможете использовать форматы текстур с одним каналом с достаточной точностью, как GL_R32F. В более старых версиях GL вы можете вручную объединить каналы RGB или RGBA стандартных 8-битных текстур в 24 или 32-битные значения.
Однако есть некоторые мелкие детали, которые вы должны принять во внимание. Запись в буфер глубины происходит только в том случае, если GL_DEPTH_TEST
включен. Это, конечно, может отбросить некоторые ваши фрагменты (если буфер глубины не очищен раньше). Один из способов обойти это установка glDepthFunc()
в GL_ALWAYS
во время рендеринга буфера глубины.
Вы также должны иметь в виду, что рендеринг пишет в все буферы, а не только буфер глубины. Если вы не хотите изменять цветовой буфер, вы можете установить glDrawBuffer()
в GL_NONE
или может использовать glColorMask()
предотвратить перезапись. Если вы используете трафаретный буфер, вы, конечно, также должны отключить или замаскировать запись в него.