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