Ваша проблема решит рендеринг с 1-битной альфа. Это означает, что вы указываете некоторую альфу исходной текстуры, которая не отображается (в основном 0,5).
Вы должны написать свой собственный шейдер для сохранения глубины от света и использовать инструкцию discard
. Discard существует также в hlsl, glsl и в cg. Он существует только в пиксельном / фрагментном шейдере и отбрасывает текущий фрагмент из рендеринга в backBuffer и в z-буфер.
if (texSample.a < 0.5)
discard;
Преимущество заключается в том, что вам не нужно менять свой рендеринг за 2 прохода, только рендеринг глубины освещения. Также я докажу, что это работает:
Если вы хотите визуализировать правильные тени для нескольких прозрачных объектов, вам придется использовать несколько текстур глубины с информацией о глубине и непрозрачности, отображаемой с помощью пилинга глубины. А для дыма, волос и т. Д. Глубокая непрозрачность или карты непрозрачности Фурье - лучшее решение (я в основном рекомендую карты непрозрачности Фурье)
редактировать: я только что понял, что я забыл добавить кредиты. Как всегда. Древовидная модель взята из петлевого проекта, который просто великолепен, если вы ищете низкополигональную, одну текстуру и бесплатные модели растительности.
Вам нужен собственный шейдер для генерации карты теней, чтобы вы могли вывести действительный окклюдер, когда прозрачность пикселя / фрагмента превышает заданный вами порог. Таким образом, карта глубины будет генерироваться для каждого пикселя, а не для многоугольника.
источник
Единственный способ сделать это - создать отдельную текстуру карты глубины, отобразить в ней деревья, вывести их на глубину, где alpha! = 0, в противном случае вывести глубину = 1, а затем объединить эту текстуру карты теней с текстурой карты теней сцены. , который должен быть достаточно простым; просто возьмите наименьшее из двух значений и установите его в окончательную карту глубины.
Это не решает смешивание заказов, хотя; если вы выводите глубину за альфа-текстурой, она будет переопределена при рендеринге четырехугольника с текстурой на нем, поэтому для того, чтобы этот эффект работал, вам придется визуализировать каждый квад по отдельности в текстуру карты глубины ...
источник