2016-04-05 13 views
0

Bol miktarda ışık kaynağıyla (yaklaşık 350) harita tanımım var. Ben THREE.PointLight nesneleri oluşturabilir ve bunları sahneye eklemek çalışıyorum, ben düşük FPS ile birlikte aşağıdaki hatayı alıyorum:Sahnedeki birçok ışık kaynağı nasıl kullanılır?

three.js:29438 THREE.WebGLProgram: shader error: 0 gl.VALIDATE_STATUS false gl.getProgramInfoLog Fragment shader active uniforms exceed MAX_FRAGMENT_UNIFORM_VECTORS (1024). 

Ne anlama geliyor? Sahnede THREE.PointLight nesnelerinin bir sınırı var mı? Çok fazla ışık kaynağınız olduğunda yüksek performansı korumak için iyi uygulamalar var mı? Şimdilik akla gelen tek fikir, bir şekilde ışık kaynaklarının sayısını azaltmak ve sadece gerçekten ihtiyacım olan şeyleri bırakmaktır.

+1

Eklediğiniz her ışık için, üç.js'nin gölgelendiriciye bazı konumlar eklemesi gerekir (konum, güç vb.). MAX_FRAGMENT_UNIFORM_VECTORS, grafik kartına bağlıdır. Yani gerçekten ne kadar ışık tutabildiğin, cihazına bağlı. – Benedikt

+1

Three.js, "forward rendering" öğesini varsayılan olarak kullanır. İleri işleme genellikle birkaç ışığın sınırına sahiptir. Etrafı açmak için ışıkları yakıp söndürmeyi (veya onları sahneden çıkarmayı) gerektirir, böylece herhangi bir zamanda gerçekte sadece birkaç tane kullanılır. "ertelenmiş oluşturma" bu limitleri kaldırır (bir işlem dışında başka bir sınırı vardır). Three.js için uygulanan birkaç ertelenmiş renderer var. Bunu Google’a isteyebilirsiniz. – gman

+0

Geçtiğimiz günlerde, bakım yükü nedeniyle deferredWebGLRenderer'ın Three.js'den kaldırıldığını kontrol ettim. Bazı özellikler WebGL 2.0 sürümünden sonra uygulanacaktır. –

cevap

1

Bu hata, parça gölgelendiricinizdeki en fazla sayıda üniformayı aştığınız anlamına gelir. Bu limit grafik kartınız ve/veya sürücünüz tarafından belirlenir. http://webglreport.com/ adresine giderek kontrol edebilirsiniz.

Sisteminizde, limit 1024 gibi görünüyor. Bir Three.js ışığı, ışık türüne ve malzemeye bağlı olarak tipik olarak 6-10 üniforma kullanır. ~ 350 ışık kullandığınız göz önüne alındığında, bu sınırı aştığınızı hissettiriyorsunuz.

Genel olarak 350 ayrı ışık, çok, muhtemelen ihtiyacınız olandan çok daha fazla. Daha fazla ışık kullanmak da hesaplama açısından yoğun. Tipik bir WebGL sahnesinde bir avuçtan fazlası yoktur. İstediğiniz şeyi elde etmek için başka teknikler de düşünebilirsiniz.

İlgili konular