OpenGL - не записывать глубину, если альфа

Что я хочу сделать в OpenGL с использованием C ++ и GLSL: когда текстура имеет альфа (texture.a! = 1.0;), то этот пиксель не записывается в буфер глубины. (для буфера цвета написано) Глубина записи происходит только при пиксельной текстуре. a == 1.0;

Отказ в шейдере не является решением - тогда этот пиксель не записывается в буфер цвета.

Любые идеи?

@UPDATE: Пример: у меня есть изображения пользовательского интерфейса, обработанные OpenGL. У некоторых из них в углах есть альфа. При рендеринге сцены у меня есть «предварительный проход глубины», чтобы сэкономить некоторые пиксели, не рассчитывая на них свет. Я также хочу получить изображения пользовательского интерфейса для этого предварительного прохода, но только полностью непрозрачные пиксели (альфа = 1.0).


person Skides    schedule 05.10.2013    source источник
comment
Не могли бы вы объяснить свою мотивацию? Похоже, вы пытаетесь реализовать прозрачность, не зависящую от порядка. Если вы объясните технику, которую пытаетесь выполнить, мы можем предложить вам лучшее решение.   -  person Andon M. Coleman    schedule 05.10.2013
comment
На самом деле это не имеет большого смысла, вы пытаетесь сделать это в предварительном проходе глубины, который по определению должен иметь отключенную запись буфера цвета, независимо от того, отбрасываете ли вы фрагмент или нет, не должно влиять на то, записывается ли его цвет в буфер цвета в предварительном проходе глубины. Я думаю, что вы действительно хотите использовать буфер трафарета во время рендеринга графического интерфейса пользователя, чтобы замаскировать непрозрачные биты экрана, а затем увеличить предварительный проход глубины для записи в буфер глубины в этих местах (запишите глубину ближней плоскости для всего, что удовлетворяет вашим условиям трафарета).   -  person Andon M. Coleman    schedule 05.10.2013
comment
В качестве альтернативы, записывайте в тот же буфер глубины при визуализации графического интерфейса пользователя в качестве предварительного прохода глубины; напишите gl_FragDepth = 0.0 для непрозрачных фрагментов, gl_FragDepth = 1.0 для всего, что имеет значение альфа! = 1.0. Любой из подходов работает, но вам придется перерисовывать графический интерфейс в каждом кадре, если вы делаете это таким образом.   -  person Andon M. Coleman    schedule 05.10.2013
comment
Это своего рода решение. Но есть ли способ НЕ писать глубину для альфа-пикселей?   -  person Skides    schedule 07.10.2013
comment
В основном нет. Когда вы пишете фрагмент, вам всегда нужно записывать значение глубины, нет возможности выборочно включать или отключать это на уровне шейдера. Вы можете написать значение глубины, которое гарантированно приведет к провалу теста глубины при правильных обстоятельствах (это то, что я объяснял во втором решении), и в этом случае вы знаете, что значение глубины не попадет в финальный кадровый буфер. Или, если он действительно попадает в буфер кадра, вы можете быть уверены, что записанное вами значение глубины равно глубине, на которую вы очистили буфер, поэтому это не будет иметь значения.   -  person Andon M. Coleman    schedule 07.10.2013


Ответы (1)


Как упоминалось в комментариях Андона: «Вы всегда должны писать значение глубины, когда пишете фрагмент. , нет возможности выборочно включать или отключать это на уровне шейдера ".

person Little Endian    schedule 13.04.2016