У меня есть вопрос / проблема относительно EffectComposer.

Что я пытаюсь сделать: Я пытаюсь разделить всю постобработку, используемую в моем приложении, между несколькими EffectComposers. Я хотел бы иметь возможность рассчитать, например, 5 шейдеров в EffectComposer1 , затем возьмите изображение, созданное этим композитором, и передайте его обратно в униформу, например, EffectComposer2 . И геометрия, и текстура, используемые в EffectComposer1, подходят (с точки зрения их размера в пикселях) для использования в качестве униформы в EffectComposer2 .

AFAIK, буфер записи / чтения EffectComposers должен содержать текстуру, которая будет отображаться на экране, если для эффекта не установлено значение renderToScreen = true;.

Если для решения этой проблемы требуется дополнительная информация, сообщите мне.

С уважением, Майкл

Использование three.js r82

2
mxl 21 Дек 2016 в 23:57
Я не знаком с композиторами, а без кода или jsfiddle даже эксперт вряд ли сможет вам помочь. Но как дикая догадка, я думаю, у вас могут быть проблемы с синхронизацией, например. нижестоящая операция пытается прочитать данные до того, как вышестоящая операция закончит их запись. Это может быть решено путем вывода текстуры восходящего потока на сетку в (скрытой) сцене с помощью ортогональной камеры и рендеринга в буфер. Затем на следующем шаге анимации считайте данные буфера в следующую операцию. Я не знаю подробностей, но вы можете искать связанные сообщения о переполнении стека.
 – 
steveOw
27 Дек 2016 в 16:33
Привет, Стив, я не включил сюда никакого кода, потому что я не был уверен, какой путь выбрать в то время, когда писал это. Однако: я создал здесь сообщение на форуме (html5gamedevs.com/topic/ …), где я объясняю проблему более подробно. Но я обновлю свой пост здесь позже. Спасибо за ответ.
 – 
mxl
30 Дек 2016 в 19:19

1 ответ

Лучший ответ

Аааааа и мы закончили!

После тестирования и, наконец, создания еще одной проблемы на github, я смог решить эту проблему.

Я придерживаюсь этого пока, так как это работает как абсолютный шарм.

Это код, который я использую для создания текстуры:

var firstOutput = document.getElementById("CanvasOne"); //Get the filled canvas;
var tmpTxt = new THREE.CanvasTexture(firstOutput); //Create the texture;

//Set both min- and magFilter to the correct filtering;
tmpTxt.magFilter = THREE.LinearFilter;
tmpTxt.minFilter = THREE.LinearFilter;
tmpTxt.generateMipmaps = false; //Set this to resolve the image dstortion;

Впоследствии я смог использовать tmpTxt как униформу.

-1
mxl 10 Мар 2017 в 20:54