2012-03-23 3 views
0

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

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

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

+3

Что означает «правильное смешивание альфа-каналов»? Какую проблему вы пытаетесь исправить? Вы пытаетесь сделать какую-то независимую от заказа вещь? –

+1

В дополнение к тому, что сказал Никол Болас: Для независимой прозрачности заказа недостаточно дополнительного буфера глубины. Что работает, разбивая сцену в слоях, что называется глубинным пилингом. Но реализация этого не является тривиальной. – datenwolf

+0

@NicolBolas, да. Если я могу читать Z-Buffer из glsl, то у меня есть простой способ сделать это! –

ответ

2

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

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

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

Eric Enderton написал a decent paper (который имеет slide version) на стохастической независимой от заказа прозрачности, которая идет вместе с реализацией DirectX, которую стоит проверить.

2

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

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

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

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

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

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

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