1
알파 채널을 보존하는 텍스처 패스를 결합하려고합니다. 나는 그것을 시도했거나 확신했다.THREE.js transparency and EffectComposer
- 렌더러는 다양한 setClearColor 설정으로 진정한
- 렌더러로 설정 알파가 있습니다.
- 효과가 사용하는 전체 화면 쿼드의 재료는 투명성이 텍스처는
- 투명 사실에 사실
- 로 설정 한 전달 나는 알파 채널
다른 것들을 주석 처리하면 텍스처/패스가 모두 올바르게 그려집니다. 단지 PNG1.png를 gits.jpg 위에 블렌드 할 수 없습니다.
var width = window.innerWidth;
var height = window.innerHeight;
var updateFcts = [];
var masterRenderer = new THREE.WebGLRenderer({
alpha: true,
autoClear: false
});
masterRenderer.setSize(window.innerWidth, window.innerHeight);
masterRenderer.setClearColor (0xFFFFFF, 1.0);
document.body.insertBefore(masterRenderer.domElement, document.body.firstChild);
var parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat, stencilBuffer: false };
var renderTarget = new THREE.WebGLRenderTarget(width, height, parameters);
var masterComposer = new THREE.EffectComposer(masterRenderer, renderTarget);
var gitsTexture = THREE.ImageUtils.loadTexture("images/gits.jpg");
var pngTexture = THREE.ImageUtils.loadTexture("images/PNG1.png");
// declare passes
var passes = {};
passes.toScreen = new THREE.ShaderPass(THREE.CopyShader); passes.toScreen.renderToScreen = true;
passes.gitsTexturePass = new THREE.TexturePass(gitsTexture);
passes.gitsTexturePass.material.transparent = true;
passes.pngTexturePass = new THREE.TexturePass(pngTexture);
passes.pngTexturePass.material.transparent = true;
//add passes
masterComposer.addPass(passes.gitsTexturePass);
masterComposer.addPass(passes.pngTexturePass);
masterComposer.addPass(passes.toScreen);
// render the webgl
updateFcts.push(function(delta,now){
masterComposer.render();
})
//////////////////////////////////////////////////////////////////////////////////
// handle resize //
//////////////////////////////////////////////////////////////////////////////////
function onResize(){
width = window.innerWidth;
height = window.innerHeight;
// notify the renderer of the size change
masterRenderer.setSize(window.innerWidth, window.innerHeight);
// update the camera
camera.aspect = window.innerWidth/window.innerHeight
camera.updateProjectionMatrix();
resizeFcts.forEach(function(resizeFn){resizeFn()})
}
window.addEventListener('resize', onResize, false)
//////////////////////////////////////////////////////////////////////////////////
// loop runner //
//////////////////////////////////////////////////////////////////////////////////
var lastTimeMsec= null
requestAnimationFrame(function animate(nowMsec){
// keep looping
requestAnimationFrame(animate);
// measure time
lastTimeMsec = lastTimeMsec || nowMsec-1000/60
var deltaMsec = Math.min(200, nowMsec - lastTimeMsec)
lastTimeMsec = nowMsec
// call each update function
updateFcts.forEach(function(updateFn){
updateFn(deltaMsec/1000, nowMsec/1000)
})
})
라이브 예제가 도움이 될 것입니다. 또한 'autoClear'를 올바르게 설정하지 않았습니다. Use renderer.autoClear = false; 또한, 당신은'alpha : true'를 가지고 있지만, clearAlpha는 1.0입니다. – WestLangley
대단히 고맙게 여기며 내가 얻은 효과를 얻을 수 있었지만 여전히 원래의 문제를 일으키는 원인을 알 수 없었습니다. – Weavermount
렌더러 생성자에서'{premultipliedAlpha : false}'를 시도해 볼 수는 있지만 블렌딩 모드를 조심해야합니다. – WestLangley