Я написал код для рендеринга сцены, содержащей источники света, которые работают как проекторы. Но их много (больше, чем можно представить при фиксированном количестве источников света в одном шейдере). Итак, прямо сейчас я рендерил это, создавая собственный шейдер и визуализируя сцену один раз для каждого источника света. Каждый проход фрагментного шейдера определяет вклад для этого источника света, и блендер добавляет этот вклад в буфер. Мне было очень неудобно настраивать в three.js. Я не мог найти способ сделать несколько проходов, как этот, где были разные материалы и разные геометрии, необходимые для разных проходов. Я должен был сделать это, имея несколько сцен. Проблема в том, что у меня не может быть object3d, который находится в нескольких сценах (пожалуйста, исправьте меня, если я ошибаюсь). Поэтому мне нужно создать дубликаты объектов - по одному для каждой сцены, в которой он находится. Все это начинает быстро выглядеть по-хакерски. Все это настолько особенное, что кажется несовместимым с различными функциями фреймворка three.js, такими как VR Rendering. Каждый источник света требует затенения, но у меня нет памяти для буфера теней для каждого источника света, поэтому он чередуется между рендерингом буфера теней для источника света, затем фазы накопления для этого источника света, затем буфера теней для следующего источника света, затем аккумулятор следующий свет и т. д.
Я бы предпочел сделать это более "тройным" способом. Кажется, я пишу "взломать взлом", чтобы заставить это работать, каждый раз отказываясь от еще одной фреймворковой функции Three.js, которая не работает должным образом в сочетании с моей многопроходной техникой. Но не похоже, что то, что я делаю, настолько необычно.
Моим главным сюрпризом является то, что я не могу найти способ настроить многопроходную сцену, которая выполняет рендеринг и накопление назад и вперед. И второе удивление в том, что создаваемые мной Object3D не любят, когда их добавляют в несколько сцен одновременно, поэтому мне приходится создавать дубликаты каждого объекта для каждой сцены, в которой он хочет находиться, чтобы их состояние не изменялось. мешая друг другу.
Так есть ли способ сделать этот вид многопроходной накопительной сцены лучше? Опять же, я бы описал это как сцену с> максимальным количеством источников света, которые допускаются за один проход шейдера, так что их вклады должны отображаться альтернативно (теневые буферы), а затем аддитивно накапливаться за несколько проходов. Огни работают как обычные кинопроекторы, которые проецируют изображение (в отличие от однородного однотонного источника света).
Как я могу сделать многопроходный рендеринг, как это, и при этом использовать преимущества таких базовых элементов, как стерео рендеринг для виртуальной реальности и автоматическое создание теневого буфера?
Вот упрощенный фрагмент, который демонстрирует вовлеченные сцены:
renderer.render(this.environment.scene, camera, null);
for (let i = 0, ii = this.projectors.length; i < ii; ++i) {
let projector = this.projectors[i];
renderer.setClearColor(0x000000, 1);
renderer.clearTarget(this.shadowRenderTarget, true, true, false);
renderer.render(projector.object3D.depthScene, projector.object3D.depthCamera, this.shadowRenderTarget);
renderer.render(projector.object3D.scene, camera);
}
renderer.render(this.foreground.scene, camera, null);
Есть сцена, которая отображает освещение из окружающей среды (выполняется при нормальном освещении), затем есть сценарий для каждого проектора, который вычисляет карту теней для проектора, а затем добавляет вклад света от каждого проектора, после чего возникает " передний план »сцена с оверлеями и пользовательским интерфейсом.
Есть ли еще способ "three.js"?