Мой собственный z-буфер - PullRequest
1 голос
/ 24 марта 2012

Как я могу создать свой собственный z-буфер для правильного смешивания альфа-каналов? Я использую GLSL. У меня есть только одна идея. И это использовать 2 «буфера», один из которых хранит компонент глубины, а другой цвет (с альфа-каналом). Мне не нужен доступ к буферу в моей программе. Я не могу использовать единый массив, потому что у glsl есть ограничение на количество переменных формы. Я не могу использовать FBO, потому что поведение при написании и чтении Frame Buffer не определено (и не работает ни на каких картах).

Как я могу решить эту проблему?!

Или как читать реальный z-буфер в реальном времени из glsl? (Я имею в виду, для каждого фрагмента шейдерного вызова вызов z-буфера должен обновляться)

Ответы [ 2 ]

3 голосов
/ 24 марта 2012

Как создать собственный z-буфер для правильного смешивания альфа-каналов?

Это невозможно.Для идеальной прозрачности, не зависящей от порядка, вы должны избавиться от z-буфера и заменить его другим механизмом удаления скрытой поверхности.

С z-буфером есть два возможных способа решения проблемы.

  1. Многослойный z-буфер (непрактично с аппаратным ускорением) - в основном он будет хранить несколько слоев значений «глубины» и будет использовать его для смешивания прозрачных поверхностей.Захватит много памяти, и будет максимальное количество прозрачных наложенных поверхностей, как только вы превысите предел, появятся артефакты.
  2. Пилинг глубины (Google google).Закажите независимую прозрачность, но есть ограничение на максимальное количество «наложенных» прозрачных полигонов на пиксель.Реально может быть реализовано на оборудовании.

У обоих подходов будет ограничение (максимальное количество перекрывающихся прозрачных полигонов на пиксель), когда вы превысите предел, сцена больше не будет правильно отображаться.Это означает, что все это довольно бесполезно.

Что вы действительно можете сделать (чтобы получить идеальное решение), так это полностью удалить zbuffer и создать конвейер графического рендеринга, который соберет все визуализируемые полигоны, обрежет их,разделить их (когда пересекаются два полигона), отсортировать их, а затем нарисовать их на экране в правильном порядке, чтобы убедиться, что вы получите правильный результат.Однако это сложно, а сделать это с аппаратным ускорением сложнее.Я думаю (я не совсем уверен, что это произошло) 5 или 6 лет назад в каком-то документе, связанном с графическим процессором ATI, упоминалось, что некоторые из их карт могут отображать правильную сцену с отключенным Z-буфером путем включения какого-либо расширения.Тем не менее, они ничего не сказали об альфа-смешивании.С тех пор я не слышал об этой функции.Возможно, он не стал популярным и разделил судьбу TruForm (забыто).Также такой конвейер рендеринга не сможет сделать некоторые вещи, которые возможны на z-буфере

2 голосов
/ 24 марта 2012

Если вы хотите получить прозрачные пленки, не зависящие от порядка, то основная проблема заключается в том, что буфер глубины хранится на глубине на пиксель, но если вы создаете вид частично прозрачной геометрии, то в каждый пиксель вносится более одного фрагмента.

Если вы решите проблему надежно, вам потребуется упорядоченный список глубин на пиксель, возвращаясь к ближайшему непрозрачному фрагменту.Затем вы пройдете список в обратном порядке.На практике OpenGL не делает таких вещей, как массивы переменного размера, поэтому люди достигают в значительной степени этого, рисуя свою геометрию в обратном порядке.

Альтернатива, воплощенная GL_SAMPLE_ALPHA_TO_COVERAGE, заключается в переключении на экранную дверьпрозрачность, которая неотличима от реальной прозрачности либо в действительно высоком разрешении, либо с мультисэмплингом.В идеале вы бы сделали это стохастически, но это лишило бы правило повторяемости OpenGL.Тем не менее, поскольку вы находитесь в GLSL, вы можете сделать это для себя.Ваш сэмплер просто берет входную альфа и использует ее как вероятность того, что он выведет последний пиксель.Так что возьмите случайное значение в диапазоне от 0,0 до 1,0 откуда-то, и если оно больше, чем альфа, то отбросьте пиксель.Всегда выводите с альфа 1.0 и просто используйте буфер нормальной глубины. Ответы, подобные этим рассказывают немного больше о том, что вы можете сделать, чтобы получить случайные числа в GLSL, и, очевидно, вы хотите увеличить мультисэмплинг как можно выше.

Эрик Эндертон написал достойная статья (в которой слайд-версия ) о стохастической прозрачности, не зависящей от порядка, которая идет вместе с реализацией DirectX, которую стоит проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...