Three.js · Işık ve materyaller · Gölgeler
Gölgelerde performans optimizasyonu: kalite ve hız dengesi
Her gölge üreten ışık, sahneyi bir kez daha render etmek anlamına gelir; doğru sırayla küçük kesintilerle büyük kazanç sağlanır.
Three.js sahnelerinde gölgeler, GPU üzerindeki en maliyetli işlemlerden biridir. Unutulmaması gereken temel gerçek şudur: Her gölge üreten ışık, sahnenin baştan sona bir kez daha render edilmesi demektir (ışık türüne göre birden çok pass ile).
PointLight ≈ 6 render pass: Bir PointLight, küp haritası için altı yöne gölge ürettiği için sahnede genellikle en ağır yükü oluşturur. Önce ışık sayısını sınırlamak en büyük kazançtır.
Bağlam: Gölge girişi, Shadow map, Gölge türleri tablosu, Bias & Shadow Acne.
Gölge render mantığı (Shadow pass süreci)
Bu özet, gölgeler açıldığında GPU’nun ana kareye ek olarak hangi pass’leri çalıştırdığını gösterir. Tek kamera görüntüsü yetmez; ışık görüşünden derinlik toplanır, ana pass’te karşılaştırılır.
-
Kamera
Normal render (ekran görüntüsü)
- Kamera sahneye bakar; tüm objeler çizilir.
- Işık ve materyaller hesaplanır.
Ana pass: Her karede yapılan zorunlu render.
-
Işık
Shadow render (derinlik pass’i)
- Sahne, ışığın bakışından tekrar işlenir.
- Yalnızca derinlik (depth) hesaplanır → shadow map.
Amaç: “Işık bu noktayı görüyor mu?” sorusuna veri üretmek.
-
Karşılaştırma
Shadow test (ana pass içinde)
Bu iki değer aynı yüzey noktasına aittir; biri kameradan, biri ışığın bakışından ölçülür.
Kameradan görülen uzaklıkZpixelShadow map’teki derinlikZmapZpixel > Zmap → nokta ışığın gördüğünden uzaktadır → gölge.
-
PointLight
Küresel ışık = 6 yön
+X −X +Y −Y +Z −ZTek bir PointLight, gölge için sahneyi 6 kez render eder — pratikte 6× ek shadow pass maliyeti.
Kabaca render maliyeti
| Normal sahne (kamera) | 1 |
|---|---|
| Directional / Spot (gölge açık) | +1 (tek yön) |
| PointLight (gölge açık) | +6 (küresel) |
HoloDepth özeti:
Gölge = ekstra render maliyeti.
Işık sayısı arttıkça performans düşer.
Özellikle PointLight en pahalı senaryodur.
- Her gölge üreten ışık, sahneyi bir veya birden fazla kez daha işler.
- PointLight gölgesi tek ışıkta bile 6× shadow pass ile en pahalı senaryolardan biridir.
Pass sayısı → sahne planı
Tablodaki rakamlar üst sınır düşüncesidir: her ek Directional veya Spot için en az bir gölge
pass’i, her PointLight için altı yönlük küp beklenir. Gerçek maliyet
castShadow kapsamı ve geometri yoğunluğuyla büyür. Profil alırken önce ışık
sayısını, sonra mapSize ve frustumu oynayın;
Shadow
Playground bu sırayı somutlaştırmak için uygundur.
Performans etki hiyerarşisi (nereden başlamalıyım?)
Optimizasyon yaparken en büyük kazancı sağlayan faktörleri sırasıyla bilmek, vaktinizi doğru harcamanızı sağlar:
- Işık sayısı (özellikle PointLight) — öncelik çok yüksek: en büyük performans katili.
Shadow mapboyutu (mapSize) — öncelik yüksek: piksel yoğunluğu ve bellek (VRAM).- Gölge kamerası frustum’u — öncelik yüksek: ışığın görüş alanının verimliliği.
- Gölge tipi seçimi — öncelik orta: filtreleme algoritmasının yükü.
castShadow/receiveShadow— öncelik orta: obje bazlı mikro ayarlar.
Profilde aynı sırayı koruyun
FPS düşüşünü «gölge tipiyle düzeltelim» diye baştan PCF / VSM arasında gezinmek çoğu zaman zaman kaybıdır. Önce gölge üreten ışık sayısını ve PointLight yükünü düşürün; ardından harita boyutu ve kutu; en sonda filtre tipi ve ince bayraklar. Bu sıra hem bölüm 1 listesiyle hem sahne profiliyle örtüşür.
mapSize: gizli katlanma
maliyeti
light.shadow.mapSize değerini artırırken matematiksel yükün farkında olun:
- Geometrik artış:
mapSizedeğerini 2 katına çıkardığınızda (ör. 512’den 1024’e), işlenen piksel sayısı 4 kat artar. Bu durum hem GPU işlem süresini hem de VRAM kullanımını aynı oranda şişirir. - Pratik takas: Çoğu zaman 2048 yerine 1024 kullanmak, görsel olarak fark edilmeyen ama FPS tarafında ciddi rahatlama sağlayan akıllıca bir seçimdir.
Kenar 2× → alan 4×
mapSize’ı büyütürken yalnızca çizgiyi değil kare alanıyı
çoğalttığınızı aklınızda tutun; bellek ve fill oranı kabaca bundan etkilenir. Okuma için
BasicShadowMap · mapSize bölümünü bu sayfanın hiyerarşisiyle
birlikte kullanın.
Shadow camera (frustum) alanı
Gölge kamerasının kapsadığı alanı (frustum) daraltmak, kaliteyi çoğu zaman “bedavaya” artırır.
Alan ve keskinlik: Daha küçük bir alan, eldeki piksel sayısının
(mapSize) daha yoğun bir bölgeye odaklanması demektir. Yani alanı daraltarak,
mapSize’ı artırmadan çok daha keskin gölgeler elde edebilirsiniz.
Dar kutu, bias tarafına da nefes verir
Gölge kutusu gereksiz genişse aynı piksel sayısı büyük bir dünya hacmine yayılır; hem keskinlik düşer hem de acne / bias ayarı zorlaşır. Kutuyu sıkılaştırmak, çoğu ekipte önce harita ve frustum önerisiyle aynı yönde çalışır.
autoUpdate ve statik
gölgeler
Sahnede her şeyin her karede güncellenmesi gerekmez.
Statik mod: Işıklar ve gölgelenen geometri gerçekten sabitse,
renderer.shadowMap.autoUpdate = false ile gölge haritasını bir kez hesaplayıp
dondurabilirsiniz. Hareket veya değişiklik olduğunda
renderer.shadowMap.needsUpdate = true (ve gerektiğinde tekrar
autoUpdate) ile yenilemek gerekir.
// Statik sahne — örnek
renderer.shadowMap.autoUpdate = false;
// Sahne veya ışık değişince bir kez:
renderer.shadowMap.needsUpdate = true;
Uyarı
Hareketli karakter veya dinamik obje varken gölgeyi dondurursanız, gölgeler objeyi takip etmez; sahne tutarlılığı bozulur. Bu mod yalnızca gerçekten statik kurulumlar içindir.
Seyrek güncelleme senaryosu
Ortam statik, yalnızca birkaç obje seyrek hareket ediyorsa tam kare dondurmak yerine
değişim anında needsUpdate ile tek seferlik yenileme düşünülebilir — fakat
uygulama detayı projeye göre değişir; hareketli kamera veya sürekli animasyonda
autoUpdate = false açık unutulmamalıdır.
Shadow map tipi ve performans
| Tip | Kalite | Performans |
|---|---|---|
| BasicShadowMap | Düşük (sert) | Çok hızlı |
| PCFShadowMap | Orta | Dengeli |
| PCFSoftShadowMap | Yüksek (yumuşak) | En pahalı |
Not: VSMShadowMap farklı bir matematiksel yaklaşım kullandığı için performansı sahnenin karmaşıklığına ve donanıma göre değişken olabilir; ölçüm ve test ile kullanılmalıdır.
Tip seçimini listenin sonuna bırakın
Tablo, kalite ve maliyet için kabaca göreli bir sıralama sunar; donanım ve sahne tipine göre sapma normaldir. Işık sayısı ve harita bütçesi toparlanmadan yalnızca PCFSoft veya VSM maliyeti üzerinde dönmek, çoğu zaman ikinci planda kalmalıdır.
Seçici gölge yönetimi (cast & receive)
En basit optimizasyon bazen hiç işlem yapmamaktır: gereksiz yüzeyleri gölge hattından çıkarın.
- Önemsiz objeler: Görünmeyen, çok küçük veya arka planda kalan
nesnelerde gölgeyi tamamen kapatın (
castShadow = false,receiveShadow = false). - Zemin kuralı: Zeminler çoğu zaman yalnızca gölge alır, gölge
düşürmez.
castShadow = falseile zemini gölge üretiminden çıkarmak, gereksiz yükü azaltır.
Zemin: çoğu zaman yalnızca alıcı
Zemin ağlarında castShadow = false bırakmak, gölgelerin hâlâ zeminde okunmasına
izin verirken gereksiz occluder geometrisini derinlik pass’lerinden çıkarır. Bitki örtüsü
veya dekoratif küçük öğelerde seçici bayraklar, düşük maliyetle stabil FPS sağlamanın en
hızlı yollarından biridir.
HoloDepth performans checklist
Üretim öncesi akış
Aşağıdaki maddeleri kontrol ederek sahnenizi üretim seviyesine yaklaştırın; sıra, bölüm 1–6’daki öncelik hiyerarşisiyle uyumludur:
- Sahnedeki gölge üreten ışık sayısı minimuma indirildi mi?
mapSizegereğinden büyük mü? (Örn. 1024 yeterliyken 2048 kullanılıyor mu?)- Shadow camera yalnızca ilgili objeleri kapsayacak kadar dar mı?
- Gereksiz objelerde
castShadowvereceiveShadowkapalı mı?
Artefakt taraması için Bias & Shadow Acne özeti; tür seçimi için gölge türleri tablosu.
Altın kural
En büyük performans kazancı, neredeyse her zaman ışık sayısını azaltmaktan gelir — özellikle çok pass üreten PointLight gölgelerinde.