Предположим, что у вас есть сцена с улицей, на которой много уличных фонарей (больше 20), вы приближаете объект к ним и ожидаете тень.
Огни, просто
var light = new THREE.PointLight(0xffffff, 0.5, 6.0);
Только на улице есть .receiveShadow = true
и только у машины есть .castShadow = true
(кроме фар)
В three.js добавление .castShadow = true
ко всем источникам света вызывает следующую ошибку
THREE.WebGLProgram: shader error: 0 gl.VALIDATE_STATUS false
gl.getProgramInfoLog Fragment shader sampler count exceeds MAX_TEXTURE_IMAGE_UNITS (16).
К счастью, в часовой сцене нам нужно всего несколько (максимум 4) из них, чтобы отбрасывать тень, так как большинство источников света в любом случае находятся вне досягаемости.
Я пытался использовать 2 подхода
Перебор всех источников света и динамическая настройка
.castShadow = true
или.castShadow = false
.Добавление и удаление источников света полностью, но установка их без тени или тени.
С обоими из них я получил ту же ошибку.
Какой другой подход сработает?
Обновлять
@neeh создал для него Fiddle здесь (чтобы вызвать изменение ошибки var numLightRows = 8;
на большее число). Однако следите за ошибкой, будет другая ошибка со слишком большим количеством огней, которая не вызвана той же проблемой.
Он также указал, что мы видим здесь что pointShadowMap
создается, даже если он не используется. Это объясняет, почему нет никаких изменений при «умном» подходе. Теперь это находится в коде GLSL.
Таким образом, мы ограничены графическим процессором, который в моем случае имеет 16 IMAGE_UNITS, но это не относится ко всем графическим процессорам (мой процессор на самом деле отлично работает с большим количеством). Вы можете проверить свою систему с помощью renderer.capabilities.maxTextures
. Но, как уже упоминалось, нам действительно нужно только 4.
Проблема остается.
scene.remove( light )
иscene.add( light )
, а обошел сцену для источников света, удалил их тени и включил их для тех, которые находятся близко к машине. - person gaitat   schedule 19.03.2017