2016-06-17 4 views
0

Um die Dicke eines Meshes zu schätzen, habe ich zwei renderTargets für die Daten der Front- und Backface-Tiefe eingerichtet. Konvertiere die Werte im Tiefenpuffer in lineare Tiefen und subtrahiere sie von vorne, um die Dicke zu erhalten.Ist in Three.JS clearDepth (0) möglich?

eingestellt werden, um die Tiefen Texturen rechts, sollten diese zu bekommen:

  1. während vorne Tiefen Textur-Rendering:

    mesh.material.side = THREE.FrontSide, mesh.material. depthFunc = THREE.LessEqualDepth; LöschenDepth (1); // ... klar zu weit Ebene // ... sahen dies im Code, aber nicht wissen, wie es

  2. einzustellen, während Tiefe Textur-Rendering zurück:

    mesh.material. side = DREI.BackSide, mesh.material.debthFunc = THREE.GreaterEqualDepth; LöschenDepth (0); // ... bis zum nächsten Flugzeug // ... nie im Code sehen !!

Wird dies in three.js nicht unterstützt?

Der Code (Animation) sieht wie folgt aus:

function animate() { 

    controls.update(); 
    requestAnimationFrame(animate); 
    renderer.setClearColor (0xffff00); 
    sphere.material.side = THREE.FrontSide; 
    // sphere.material.depthFunc = THREE.LessEqualDepth; 
    renderer.render (sceneRTT, cameraRTT, frontDepthTex, true); 
    sphere.material.side = THREE.BackSide; 
    // sphere.material.depthFunc = THREE.GreaterEqualDepth; 
    renderer.render (sceneRTT, cameraRTT, backDepthTex, true); 

    renderer.render (scene, camera); 
} 

ein "Arbeits" jsfiddle ist hier: http://jsfiddle.net/jmcjc5u/n3yLfk8L/14/

Das Testmodell ist eine konvexe Ellipsoid. Daher muss ich die Einstellungen von depthFunc und clearDepth nicht ändern. Aber für allgemeine konkave Modelle glaube ich, dass sie geändert werden sollten.

+0

Ist 'renderer.state.buffers.depth.setClear (Wert);', was Sie wollen? – WestLangley

+0

Ihrem Vorschlag folgend, habe ich den Code wie folgt geändert. Es funktioniert nicht!! Dann verwende ich "gl = renderer.context;" und verwende die GL-Befehle direkt. Es funktioniert OK. Was ist der Unterschied? sph.material.side = DREI.FrontSide; sph.material.dpthFunc = THREE.LessEqualDepth; renderer.state.buffers.depth.setClear (1); renderer.render (SzeneRTT, KameraRTT, FrontDepthTex, true); \t sph.material.side = DREI.BackSide; sph.material.dpthFunc = DREI.GroßerEqualDepth; renderer.state.buffers.depth.setClear (0); renderer.render (SzeneRTT, KameraRTT, BackDepthTex, true); –

+0

Diese Geige (http://jsfiddle.net/jmcjc5u/dwbdkuyw/) hat diese beiden Versionen ... –

Antwort

1

Ja, können Sie die Tiefe von gl.clearDepth(value) wie so verwendet gesetzt:

renderer.state.buffers.depth.setClear(value); 

Dadurch wird der Wert geschrieben in den Tiefenpuffer gesetzt, wenn der Tiefenpuffer gelöscht wird.

three.js r.78

+0

Willkommen bei stackoverflow. Bitte denken Sie daran, die Antworten zu akzeptieren, indem Sie auf das Häkchen klicken. Vielen Dank. – WestLangley