У вас проблемы с буфером глубины, это никак не связано с вашими шейдерами или режимами наложения.
То, что происходит, заключается в том, что порядок, в котором вы визуализируете свою прозрачную геометрию, влияет на вашу способность рендеринга за ней. Это связано с тем, что буфер глубины не имеет понятия прозрачного или непрозрачного. В результате, даже если они не вносят визуальный вклад в сцену, эти прозрачные пиксели все равно записываются в буфер глубины, и после этого любые пиксели, которые вы рисуете за ними, будут отбрасываться, потому что они «не видны». Если вы сначала нарисуете геометрию позади прозрачного объекта, он будет отображаться правильно, потому что он записывается в кадр до того, как будет установлена прозрачная глубина для его удаления.
Это то, с чем все еще сталкиваются крупные коммерческие игровые движки до некоторой степени, так что не расстраивайтесь из-за этого, вызывая некоторую путаницу. :)
Нет «идеального решения» этой проблемы, но то, к чему она действительно сводится, - это попытаться структурировать вашу сцену так:
- Визуализация любой непрозрачной геометрии, отсортированной по состоянию (шейдер / текстура / и т. Д.)
- Следующее отображение любой прозрачной геометрии. Если возможно, отсортируйте их по глубине, чтобы сначала вы нарисовали самый дальний из камеры.
Просто отметив биты геометрии, которые являются прозрачными, и отобразив их после всего остального, вы решите 90% этой проблемы, но проблема все еще может остаться для перекрывающихся прозрачных объектов. Это может быть не проблема для вас, в зависимости от вашей сцены, но если это все еще вызывает артефакты, вам нужно отсортировать прозрачные объекты по глубине, прежде чем рисовать.