2014-09-02 2 views
0

장면이 있고 장면의 맨 위에 녹색 사각형이 적용된 쉐이더가 있습니다. 흰색 구가 있지만 녹색 구형의 바깥쪽에있을 때 구가 보이지 않게해야합니다. 녹색 패스 셰이더가 통과하기 전에 렌더링 패스와 재 추가 전에 구를 제거 할 수 있습니까? 그렇지 않다면, 내가 원하는 것을 어떻게 얻을 수 있습니까?렌더링 전에 장면 전환 ShaderPass

바로 여기에는 패스 렌더링의 나 : 여기

renderPass = new THREE.RenderPass(scene, camera); 
copyPass = new THREE.ShaderPass(THREE.CopyShader); 

colorifyPass = new THREE.ShaderPass(THREE.ColorifyShader); 
colorifyPass.uniforms[ "color" ].value = new THREE.Color(0x00ff00); 
composer = new THREE.EffectComposer(renderer); 
composer.addPass(renderPass); 
composer.addPass(colorifyPass); 
composer.addPass(copyPass); 
copyPass.renderToScreen = true; 

내가 지금 무슨의 스크린 샷입니다 : WestLangley의 예에

enter image description here

+0

'THREE.MaskPass'는 원하는 것입니다. http://threejs.org/examples/webgl_postprocessing_advanced.html을 참조하십시오. 소스 코드를주의 깊게 연구해야합니다. – WestLangley

+0

나는 어떻게 MaskPass로 그것을 할 지 알지 못했다. 그러나 당신의 예제 덕분에 나는 게시 된 대답에 나타난 것처럼 이중 작곡가를 사용했다. 더 좋은 제안이 있으면 알려주십시오. –

답변

0

덕분에 내가 이런 식으로 원하는 것을 달성 결국 :

function initShaders() { 
    renderPass = new THREE.RenderPass(scene, camera); 
    copyPass = new THREE.ShaderPass(THREE.CopyShader); 

    composer = new THREE.EffectComposer(renderer); 
    composer.addPass(renderPass); 
    composer.addPass(copyPass); 
    copyPass.renderToScreen = true; 

    colorifyPass = new THREE.ShaderPass(THREE.ColorifyShader); 
    colorifyPass.uniforms[ "color" ].value = new THREE.Color(0x00ff00); 
    composerIR = new THREE.EffectComposer(renderer); 
    composerIR.addPass(renderPass); 
    composerIR.addPass(colorifyPass); 
    composerIR.addPass(copyPass); 
    copyPass.renderToScreen = true; 
} 

그리고 render() 함수에이 코드를 추가했습니다. :

renderer.setViewport(0, 0, width, height); 
    camera.fov = 45; 
    camera.aspect = window.innerWidth/window.innerHeight; 
    camera.updateProjectionMatrix(); 
    hotSpotsRoot.visible = false; 

    renderer.clear(); 
    composer.render(delta); 

    if (irMode) { 
     var irWidth = 450; 
     renderer.setViewport(width/2 - irWidth/2 + 10, 200, irWidth, irWidth); 
     camera.fov = 25; 
     camera.aspect = 1; 
     camera.updateProjectionMatrix(); 
     hotSpotsRoot.visible = true; 

     composerIR.render(delta); 
    }