Как заполнить буфер глубины вручную с помощью OpenGL и GLSL

Я провел много исследований о том, как заполнять буфер глубины вручную безуспешно. Пока что все, что я знаю, это текстура глубины (GL_DEPTH_COMPONENT), прикрепленная к FBO, которая автоматически заполняется OpenGL во время прохода рендеринга.

Например, работает следующий код фрагментного шейдера:

/*
** Output pixel color value.
*/
layout (location = 0) out float FragmentDepth;

/*
** Fragment shader entry point.
*/
void main(void)
{
     //Depth filled automatically
}

Итак, если я напишу следующую строку кода в основной:

FragmentDepth = 0.0f; //the texture should be black

результат такой же!

Поэтому мне интересно, как можно «сказать» OpenGL, что он не записывает автоматически в буфер глубины и не учитывает мое уравнение глубины?

Я попробовал функцию glDepthMask (false), но, конечно, это решение не работает!

На самом деле, я бы хотел настроить заполнение буфера глубины и не зависеть от работы OpenGL в фоновом режиме.

Как я могу это сделать?

Единственный способ - использовать буфер цвета (например, формат текстуры GL_RGB) для хранения значений глубины вручную?

Заранее большое спасибо за вашу помощь!


person user1364743    schedule 30.07.2015    source источник


Ответы (1)


Пользовательские значения глубины можно записать во фрагментном шейдере с помощью gl_FragDepth. См. Здесь: https://www.opengl.org/sdk/docs/man/html/gl_FragDepth.xhtml

Несколько дополнительных примечаний:

  • Либо все ветки, либо ни одна ветвь не должна назначать gl_FragDepth, иначе вы получите неопределенное поведение
  • Использование gl_FragDepth отключает возможный ранний Z-тест и, как правило, снижает производительность. Так что используйте его, только если это действительно необходимо
person dari    schedule 30.07.2015