Как остановить EffectComposer от уничтожения моего прозрачного фона?

Мне нужен холст threejs с прозрачным фоном. Я создаю рендерер следующим образом:

# coffeescript
r = new THREE.WebGLRenderer alpha: true

Когда я вызываю r.render(), он работает, как и ожидалось, с объектами, появляющимися на прозрачном фоне. Однако, когда я пытаюсь добавить постобработку с помощью EffectComposer, вот так:

cmp = new THREE.EffectComposer r
cmp.addPass new THREE.RenderPass scene, camera

effect = new THREE.FilmPass 0.9, 2, 2048, true
effect.renderToScreen = true
cmp.addPass effect

cmp.render 3

новый результат заключается в том, что сцена отображается так, как ожидалось (к объектам правильно применен эффект «Фильм»), ЗА ИСКЛЮЧЕНИЕМ того, что фон больше не прозрачен, как хотелось бы... вместо этого он черный и непрозрачный. Почему? Как предотвратить изменение прозрачного фона при постобработке?


person zakdances    schedule 03.01.2014    source источник


Ответы (2)


var width = window.innerWidth || 1;
var height = window.innerHeight || 1;
var parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat, stencilBuffer: false };

var renderTarget = new THREE.WebGLRenderTarget( width, height, parameters );

cmp = new THREE.EffectComposer(r, renderTarget);

Если вы не укажете цель рендеринга, он создаст ее с THREE.RGBFormat, что приведет к потере альфы.

person Gero3    schedule 03.01.2014
comment
Вау, спасибо. Поскольку EffectComposer нигде нет в документации, мне трудно изучать такие вещи, как renderTarget ...Я даже не знал, что он существует до сих пор. Как вы узнали об EffectComposer и его параметрах? - person zakdances; 05.01.2014
comment
@dman см. мой комментарий о renderpass и использовании renderPass.clear=false - person yeahdixon; 25.09.2018

RenderPass по умолчанию очищает вашу цель рендеринга!!!!! и очистит вашу альфу, если вы не будете осторожны. Поэтому чистый цвет будет установлен не из вашего исходного средства визуализации, а из самой функции RenderPass и, возможно, по умолчанию с полной непрозрачностью. Есть несколько опций, на которые стоит обратить внимание: clear,clearAlpha, clearColor,clearDepth. Что сработало для меня, так это установить renderPass.clear=false . Я также вручную очистил рендерер, так что мой renderer.autoClear=false Если вы начинаете делать много проходов, это помогает иметь точный контроль над тем, когда вы хотите, чтобы ваш рендерер очищал и вызывал их вручную.

person yeahdixon    schedule 25.09.2018