2014-06-07 21 views
6

In WebGL, ist es möglich, in den Tiefenwert des Fragments zu schreiben oder den Tiefenwert des Fragments auf andere Weise zu kontrollieren?Webgl: Alternative zum Schreiben in gl_FragDepth

Soweit ich finden konnte, ist gl_FragDepth in webgl 1.x nicht vorhanden, aber ich frage mich, ob es andere Möglichkeiten gibt (Erweiterungen, browserspezifische Unterstützung, etc.).

Was ich archivieren möchte, ist ein ray-traced Objekt spielen zusammen mit anderen Elementen mit dem üblichen Modell, Ansicht, Projektion gezeichnet.

+0

Sie können den Tiefenwert im Vertex-Shader wie folgt ändern: 'gl_Position.z = x * 2.0 - 1.0' wobei' x' in '[0,1]' (oder '[-1,1]' ohne '* 2.0) - 1.0') ... Aber das funktioniert, wenn 'gl_Position.w = 1.0' ... –

+0

@andre Noch keine Lösung? –

+1

@ViktorSehr sieht aus wie einige Browser jetzt die Erweiterung implementieren. Siehe die akzeptierte Antwort. – andre

Antwort

4

Es ist die Erweiterung EXT_frag_depth

Weil es eine Erweiterung ist es nicht überall verfügbar sein könnten, so dass Sie überprüfen müssen es vorhanden ist.

var isFragDepthAvailable = gl.getExtension("EXT_frag_depth"); 

Wenn isFragDepthAvailable nicht Falsey ist, dann können Sie es in Ihrem Shadern ermöglichen, mit

#extension GL_EXT_frag_depth : enable 

Ansonsten können Sie gl_Position.z in Ihrem Vertex-Shader manipulieren, obwohl ich für die meisten Bedürfnisse das ist nicht wirklich eine tragfähige Lösung vermuten.

2

Brad Larson eine clevere Abhilfe für dieses hat, die er in Molekülen verwendet (full blog post):

Um dies zu umgehen, implementiert ich meine eigene benutzerdefinierte Tiefenpuffer einen Frame-Buffer-Objekt, das eine gebunden wurde Textur die Größe der Bildschirm. Für jedes Bild mache ich zuerst einen Rendering-Durchlauf, wobei der einzige Wert, der ausgegeben wird, ein Farbwert ist, der der Tiefe bei diesem Punkt entspricht. Um mehrere überlappende Objekte zu behandeln, die in das gleiche Fragment schreiben können, aktiviere ich die Farbmischung und verwende die Mischgleichung GL_MIN_EXT. Dies bedeutet, dass die für dieses Fragment (R, G und B) verwendeten Farbkomponenten das Minimum aller Komponenten sind, die Objekte auf dieses Fragment zu schreiben versucht haben (in meinem Koordinatensystem ist eine Tiefe von 0,0 in der Nähe der Zuschauer, und 1.0 ist weit weg). Um die Genauigkeit der Tiefenwerte zu erhöhen, die in diese Textur geschrieben werden, kodiere ich die Tiefe so zu färben, dass mit steigender Tiefe zuerst Rot, dann Grün und schließlich Blau gefüllt wird. Das gibt mir 768 Tiefenstufen, die einigermaßen gut funktionieren.

EDIT: Gerade realisierte WebGL unterstützt nicht Min-Blending, also nicht sehr nützlich. Es tut uns leid.