2013-10-16 48 views
0

我修改這個例子:http://stemkoski.github.io/Three.js/Shader-Fireball.html如何渲染具有位移頂點的對象的深度緩衝區?

,並插入:

var depthShader = THREE.ShaderLib["depthRGBA"]; 
var depthUniforms = THREE.UniformsUtils.clone(depthShader.uniforms); 
depthMaterial = new THREE.ShaderMaterial({ 
    fragmentShader : depthShader.fragmentShader, 
    vertexShader : depthShader.vertexShader, 
    uniforms : depthUniforms 
}); 
depthMaterial.blending = THREE.NoBlending; 

depthTarget = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight, { 
    minFilter : THREE.NearestFilter, 
    magFilter : THREE.NearestFilter, 
    format : THREE.RGBAFormat 
}); 

quadCamera = new THREE.OrthographicCamera(window.innerWidth/-2, window.innerHeight/2, window.innerWidth/2, window.innerHeight/-2, -1000, 2000); 
quadCamera.position.z = 100; 

var shader = THREE.UnpackDepthRGBAShader; 
var uniforms = new THREE.UniformsUtils.clone(shader.uniforms); 
uniforms.tDiffuse.value = depthTarget; 
quadMaterial = new THREE.ShaderMaterial({ 
    vertexShader : shader.vertexShader, 
    fragmentShader : shader.fragmentShader, 
    uniforms : uniforms 
}); 

var mesh = new THREE.Mesh(new THREE.PlaneGeometry(window.innerWidth, window.innerHeight*1.5), quadMaterial); 
mesh.position.z = -500; 
mesh.position.y = 200; 
quadScene = new THREE.Scene(); 
quadScene.add(mesh); 

,改變了渲染功能:

function render() { 
    renderer.overrideMaterial = depthMaterial; 
    renderer.render(scene, camera, depthTarget, true); 
    renderer.overrideMaterial = null; 
    renderer.render(quadScene, quadCamera); 
} 

,它看起來像:http://i.imgur.com/hiHLc8g.png

  1. 我如何獲得深度緩衝區看起來像一個深度b請問,不要黑?
  2. 取代頂點的自定義ShaderMaterials是否可以正確寫入深度緩衝?因爲我有另一個項目與移動頂點的對象,深度不考慮位移。有沒有辦法做到這一點?

回答

0

嗯,我認爲這架飛機也是黑色的也是奇怪的。因爲在你的理論中,如果飛機僅用於位移頂點,那麼飛機是否不能正確着色?

也許攝像機的近平面和遠平面平面值是關閉的?因此它不能正確處理深度。你有沒有檢查過遠近的值是否在一個理智的範圍內?

相關問題