Тіні у Three.js — PCF, VSM, CSM та налаштування
Three.js реалізує тіньове відображення (shadow mapping): сцена рендериться з точки зору джерела світла у текстуру глибини, яка потім порівнюється під час основного проходу рендерингу. Цей посібник охоплює увімкнення тіней, вибір типів тіней, усунення тіньового шуму та масштабування на великі сцени за допомогою каскадних тіньових карт.
1Увімкнення тіней для рендерера, джерел світла та об'єктів
Рендеринг тіней потребує трьох прапорців увімкнення — усі три мають бути встановлені:
DirectionalLight, SpotLight та
PointLight. AmbientLight та
HemisphereLight не відкидають тіней — вони не мають єдиного
напрямку.
2Типи тіньових карт — від BasicShadowMap до VSM
| Тип | Якість | Вартість | Найкраще для |
|---|---|---|---|
BasicShadowMap |
Жорсткі, зі сходинками | Найнижча | Налагодження / стилізація |
PCFShadowMap |
М'який PCF-фільтр | Низька | За замовчуванням; більшість ігор |
PCFSoftShadowMap |
М'якіші, ширші | Середня | Архітектурна візуалізація |
VSMShadowMap |
Дуже м'які, білінійні | Середня+ | Відкриті ландшафти |
3Налаштування піраміди видимості тіньової камери
DirectionalLight використовує ортографічну тіньову камеру.
Її піраміда видимості має бути якомога щільнішою навколо
видимої сцени для найкращої щільності тіньових текселів:
mapSize — пам'ять текстур
обмежена, а карта 4096² використовує у 64× більше пам'яті, ніж 512².
4Усунення тіньового шуму за допомогою bias
Тіньовий шум (смуги самозатінення) виникає тому, що
точність порівняння глибини обмежена. Виправте його за допомогою
bias та normalBias:
5Каскадні тіньові карти (CSM) для великих сцен
CSM розбиває піраміду видимості на ближній/середній/дальній каскади, кожен зі своєю
тіньовою картою. Близькі об'єкти отримують більше текселів; віддалені — менше.
Доступно через three/examples/jsm:
6Поради щодо продуктивності
-
Заморожуйте статичні тіні — установіть
renderer.shadowMap.autoUpdate = falseі викликайтеrenderer.shadowMap.needsUpdate = trueлише коли об'єкти рухаються. - Обмежуйте кількість активних тіньових джерел світла — кожне тіньове джерело — це повний рендер сцени на GPU. Тримайте їх щонайбільше 1–2, якщо не використовуєте оптимізовані для мобільних прийоми.
-
Використовуйте менший mapSize для точкових джерел —
PointLightрендерить 6 тіньових карт (по одній на грань куба). Навіть512×512= 6 проходів рендерингу тіней. -
Вимикайте тіні на малих/віддалених об'єктах — установіть
obj.castShadow = falseдля об'єктів, що ніколи не відкидають видимої тіні. -
VSM з половинною точністю (half-float) — Three.js за замовчуванням використовує RGB-пакування
для VSM. Вмикайте
renderer.shadowMap.type = THREE.VSMShadowMapлише якщо вам потрібні дуже м'які тіні, придатні для розмиття.
Часті запитання
Чого я навчуся в цьому уроці?
Опануйте рендеринг тіней у Three.js: типи тіньових карт (PCF, PCFSOFT, VSM), каскадні тіньові карти, налаштування bias та найкращі практики продуктивності.
Які теми розглядаються в цьому уроці?
Цей урок охоплює такі теми: Увімкнення тіней для рендерера, джерел світла та об'єктів, Типи тіньових карт — від BasicShadowMap до VSM, Налаштування піраміди видимості тіньової камери, Усунення тіньового шуму за допомогою bias, Каскадні тіньові карти (CSM) для великих сцен, Поради щодо продуктивності.
Які інструменти й технології використовуються?
Цей урок використовує: Three.js, Тіньові карти, PCF, VSM, CSM.
Скільки часу займає цей урок?
Цей урок займає приблизно 40 хв.