Изменить значения 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() предотвратить перезапись. Если вы используете трафаретный буфер, вы, конечно же, должны также отключить или замаскировать запись в него.

Другие вопросы по тегам