Asumsikan untuk memiliki pemandangan dengan jalan yang banyak lampu jalan (lebih dari 20), Anda memindahkan objek ke dekatnya dan Anda mengharapkan bayangan.
Sederhananya, lampunya
var light = new THREE.PointLight(0xffffff, 0.5, 6.0);
Hanya jalan yang mempunyai .receiveShadow = true
dan hanya mobil yang mempunyai .castShadow = true
(selain nanti lampunya)
Di three.js menambahkan .castShadow = true
ke semua lampu menyebabkan kesalahan berikut
THREE.WebGLProgram: shader error: 0 gl.VALIDATE_STATUS false
gl.getProgramInfoLog Fragment shader sampler count exceeds MAX_TEXTURE_IMAGE_UNITS (16).
Untungnya dalam adegan jam kita hanya membutuhkan beberapa (maksimal 4) dari mereka untuk menghasilkan bayangan, karena sebagian besar cahaya berada di luar jangkauan.
Saya mencoba menggunakan 2 pendekatan
Mengulangi semua lampu dan menyetel
.castShadow = true
atau.castShadow = false
secara dinamis.Menambah dan menghilangkan lampu seluruhnya namun mengaturnya tanpa bayangan atau bayangan.
Dengan keduanya saya mendapat kesalahan yang sama.
Pendekatan lain apa yang bisa berhasil?
Memperbarui
@neeh membuat Fiddle untuk itu di sini (untuk menyebabkan kesalahan berubah var numLightRows = 8;
ke angka yang lebih tinggi). Namun perhatikan kesalahannya, akan ada kesalahan lain dengan terlalu banyak lampu yang tidak disebabkan oleh masalah yang sama
Dia juga menunjukkan bahwa kita melihat di sini bahwa pointShadowMap
dibuat meskipun tidak digunakan. Hal ini menjelaskan mengapa tidak ada perubahan dengan pendekatan yang “lebih cerdas”. Ini sekarang ada dalam kode GLSL.
Jadi kami dibatasi oleh GPU, yang dalam kasus saya memiliki 16 IMAGE_UNITS tetapi tidak berlaku untuk semua GPU (CPU saya sebenarnya berfungsi baik dengan lebih banyak). Anda dapat memeriksa sistem Anda dengan renderer.capabilities.maxTextures
. Tapi seperti yang disebutkan, kita sebenarnya hanya membutuhkan 4.
Masalahnya masih ada.
scene.remove( light )
danscene.add( light )
tetapi melintasi pemandangan untuk mencari lampu, menghilangkan bayangannya dan untuk yang dekat dengan mobil menyalakannya. - person gaitat   schedule 19.03.2017