#opengl #glsl #shadow-mapping
#opengl #glsl #отображение теней
Вопрос:
В настоящее время я внедряю и модифицирую некоторые альтернативные решения смещения для отображения теней. И я, конечно, комбинирую их с различными техниками для мягких теней.
И у меня возникли некоторые проблемы с PCF. Я затеняю задние поверхности поверхностей с помощью тестирования, если точечное произведение направления света и нормали фрагмента больше 0, поэтому это может быть только обратная сторона чего угодно. Работает абсолютно нормально для жестких теней.
Итак, в основном эта строка кода в моем фрагментном шейдере затеняет задние поверхности любого объекта:
isLit= dot(lsFragNormal.xyz, lightViewPos.xyz) > 0.0f ? 0.0 : isLit;
и, как уже упоминалось, отлично работает с жесткими тенями.
Когда дело доходит до PCF, моим первым намерением было использовать это так же, как указано выше, чтобы проверить, находится ли текущий тексель в ядре фильтра в тени или нет.
Это утверждение для теневого тестирования текущего текселя ядра фильтра PCF:
if((currentDepth < shadowMapDepth) amp;amp; !(dot(lsFragNormal.xyz, lightViewPos.xyz) > 0.0f ))
Но тогда «теневой край» от передней части объекта до задней части объекта по-прежнему остается жестким «теневым краем». Это, конечно, имеет смысл, поскольку для любого текселя ядра фильтра PCF всегда проверяется нормаль текущего фрагмента, и поэтому, если фрагмент находится на обратной стороне объекта, этот фрагмент будет полностью затенен.
Но когда я удаляю «тест точечного произведения», при затухании от передней к задней части объекта у меня возникают проблемы с появлением артефактов из-за скользящего света.
С «тестированием точечного продукта»: как вы можете видеть, тень, которая на самом деле отбрасывается, выглядит хорошо, но тень, которая находится на задней поверхности объекта, является жесткой тенью:
Без «точечного тестирования продукта»: край «задней тени» начинает смягчаться по направлению к светлому фронту, но затем все равно заканчивается жестким краем. И вы также можете увидеть некоторые артефакты, которые, я полагаю, происходят из-за недостаточной дискретизации в этом регионе:
Что я мог бы сделать, чтобы получить хорошую (или, по крайней мере, лучшую) мягкую тень по краям «теней сзади»? Без введения очень сложных алгоритмов, таких как «запрошенные виртуальные карты теней», что, конечно, было бы идеальным решением для этого случая, но это для интерактивных приложений, поэтому использовать подобную процедуру невозможно.
Или у меня просто нет шансов против такого сглаживания для интерактивных приложений.
И мне интересно, считаете ли вы, что жесткий край «теней задней стороны» будет приемлемым?
Комментарии:
1. Вы пробовали какую-нибудь простую интерполяцию от края до внутренней части области обратной поверхности?
2. Сделайте это, мне нужно было бы знать, как далеко я нахожусь от края, чтобы, скажем, интерполировать от освещенного до затененного по 6 следующим фрагментам до края. Но как я могу знать, поскольку это проверяется с нормальными фрагментами, поэтому, чтобы узнать, как далеко я нахожусь от края, мне понадобятся нормали соседних фрагментов (и я бы ввел много «точечного тестирования продукта»)
3. Используйте точечное произведение для интерполяции вдоль области задней поверхности. Вы бы использовали не «расстояние» от края, а ориентацию поверхности. Вероятно, он будет страдать от странного поведения на действительно сложных объектах, но это еще одна проблема, и шансы невелики.