Если это независимые от заказа прозрачные пленки, то после этого основная проблема заключается в том, что буфер глубины хранится по глубине на пиксель, но если вы составляете вид частично прозрачной геометрии, то более чем один фрагмент способствует каждому пикселю.
Если вы решите проблему, вам понадобится упорядоченный список глубин на пиксель, возвращаясь к ближайшему непрозрачному фрагменту. Затем вы переходите к списку в обратном порядке. На практике 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, которую стоит проверить.
Что означает «правильное смешивание альфа-каналов»? Какую проблему вы пытаетесь исправить? Вы пытаетесь сделать какую-то независимую от заказа вещь? –
В дополнение к тому, что сказал Никол Болас: Для независимой прозрачности заказа недостаточно дополнительного буфера глубины. Что работает, разбивая сцену в слоях, что называется глубинным пилингом. Но реализация этого не является тривиальной. – datenwolf
@NicolBolas, да. Если я могу читать Z-Buffer из glsl, то у меня есть простой способ сделать это! –