Перемещение некоторых старых эффектов в EffectComposer из alteredq и в настоящее время неуверенный способ достижения эффектов обратной связи текстуры.
В других приложениях это действительно простой процесс. Я посылаю сигнал в шейдер обратной связи (который масштабируется / умножается / вращается), отправляю сигнал в другую цепочку эффектов, а затем возвращаюсь в обратную связь для следующего прохода. С Three это было не так просто, но мне удалось заставить его работать, пинг-понг fbos.
Мне интересно оптимизировать этот процесс с помощью EffectComposer, но мне трудно воссоздать эффект.
В настоящее время я могу осмыслить использование четырех композиторов:
Первый , композитор ввода, который применяет эффекты к текущей сцене и рендерит к цели.
this.inputComposer = new THREE.EffectComposer(this.manager.renderer, this.rawTexture);
this.inputComposer.setSize(this.manager.width, this.manager.height);
const inputPass = new THREE.RenderPass(this.manager.scene, this.manager.camera.getCamera());
this.inputComposer.addPass(inputPass);
Второй , шейдер обратной связи, который принимает выходные данные из inputComposer, а также входные данные из последующего компоновщика эффектов.
this.feedbackComposer = new THREE.EffectComposer(this.manager.renderer, this.textureB);
this.feedbackComposer.setSize(this.manager.width, this.manager.height);
this.shader_feedback = new THREE.ShaderMaterial({
uniforms: {
fb: { value: this.textureA.texture },
feedback: { value: 0.6 },
scale: { value: 0.992 },
vPoint: { value: [0.5,0.5] }
},
vertexShader: feedback.vert,
fragmentShader: feedback.frag
})
const inputPass = new THREE.TexturePass(this.rawTexture.texture, 1.0);
const feedbackPass = new THREE.ShaderPass(this.shader_feedback, "feedback");
this.feedbackComposer.addPass(inputPass);
this.feedbackComposer.addPass(feedbackPass);
Третий , промежуточный композитор, ответственный за добавление шейдеров mid-feedback . Это должно быть передано обратно в шейдер обратной связи.
this.intermediateComposer = new THREE.EffectComposer(this.manager.renderer, this.intermediateTarget);
this.intermediateComposer.setSize(this.manager.width, this.manager.height);
this.shader_sharpen = new THREE.ShaderMaterial({
uniforms: {
width: { value: 0.8 }
},
vertexShader: sharpen.vert,
fragmentShader: sharpen.frag
})
const inputPass = new THREE.TexturePass(this.textureB.texture, 1.0);
const sharpenPass = new THREE.ShaderPass(this.shader_sharpen, "sharpen");
this.intermediateComposer.addPass(inputPass);
this.intermediateComposer.addPass(sharpenPass);
Четвертый , композитор вывода пост-обратной связи, для всех пост-эффектов, которые должны быть поверх всех остальных.
this.finalComposer = new THREE.EffectComposer(this.manager.renderer);
this.finalComposer.setSize(this.manager.width, this.manager.height);
this.shader_chroma = new THREE.ShaderMaterial({
uniforms: {
barrelPower: { value: 0.4 },
zoom: { value: 1.0 }
},
vertexShader: barrelBlurChroma.vert,
fragmentShader: barrelBlurChroma.frag
})
const inputPass = new THREE.TexturePass(this.textureC.texture, 1.0);
const chromaPass = new THREE.ShaderPass(this.shader_chroma, "chroma");
chromaPass.renderToScreen = true;
this.finalComposer.addPass(inputPass);
this.finalComposer.addPass(chromaPass);
и затем наконец , в рендере:
this.inputComposer.render( delta );
this.feedbackComposer.render(delta);
this.intermediateComposer.render( delta );
this.finalComposer.render( delta );
(1) Я не совсем уверен, пропускаю ли я более элегантный подход.
(2) Я не могу понять на всю жизнь, какие цели нужно поменять местами. Я знаю, что в EffectComposer есть swapBuffers (), который делает то же самое, но я не совсем уверен, куда идти.