2017-02-20 4 views
1

В Open GL можно визуализировать многоугольник с регулярным контролем глубины, но когда значение буфера глубины фактически записано в буфер глубины, я хочу написать пользовательское значение?Как написать другое значение буфера глубины, чем значение, используемое для сравнения глубины?

(Причина в том, что я представляю систему частиц, которая должна быть проверена на глубину от геометрии в сцене, но я хочу написать очень большое значение глубины, где расположена система частиц, используя, таким образом, глубину -blur этап пост-обработки для дальнейшего размытия системы частиц)

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

+1

Если вопрос «это возможно», тогда ответ «да». Выделите свою сцену в FBO, используйте приложение глубинной текстуры, чтобы выполнить «ручной» тест глубины в вашем шейдере фрагмента («отбросить фрагменты, которые не пройдут проверку глубины») и вывести произвольное значение глубины в другой буфер глубины (возможно если вы хотите), инициализируется путем blitting от FBO. Никаких гарантий на исполнение всего этого ... – peppe

+0

Спасибо, обновили вопрос. –

+0

Я никогда не использовал ARB_conservative_depth, но он мог решить вашу проблему. – pleluron

ответ

3

Вы не делаете.

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

Вы не можете (ab) использовать глубину, чтобы выполнить что-то другое, кроме проверки значений глубины.

ARB_conservative_depth/GL 4.2 действительно позволяет очень ограниченная форма этого. В принципе, вы обещаете реализацию, что вы только измените глубину таким образом, чтобы она была меньше или больше первоначального значения. Но даже тогда, это будет работать только в конкретных случаях, а затем только до тех пор, пока вы останетесь в пределах, указанных вами.

Исполнение early fragment tests аналогичным образом не позволит вам это сделать. Спецификация явно заявляет, что глубина будет записана до. Ваш шейдер выполняется. Так что все, что вы пишете до gl_FragDepth, будет проигнорировано.

+0

Спасибо, в основном консервативная глубина помогла мне, но поскольку я opengls 3.0, мне просто нужно пересмотреть мой алгоритм –

0

Вы можете использовать gl_FragDepth в шейдере фрагмента, чтобы написать свои пользовательские значения.

gl_FragDepth = 0.3; 

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/gl_FragDepth.xhtml

+3

Если вы напишете gl_FragDepth, это значение также будет использовано для сравнения глубины. Вопрос задается явно для способа изменения глубины, написанной, но не самой проверки глубины. Afaik, невозможно использовать разные значения для тестирования и записи, если один из них не делает геометрию дважды. – BDL

Смежные вопросы