2013-03-01 6 views
6

Ich benutze THREE.js mit Shader. Ich versuche die zbuffer Informationen zu bekommen.gl_FragCoord.x, y, z ist 1 für alle Pixel und w ist die Tiefe

Vertex-Shader:

// switch on high precision floats 
#ifdef GL_ES 
precision highp float; 
#endif 

void main() 
{ 
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); 
} 

Fragment-Shader:

#ifdef GL_ES 
precision highp float; 
#endif 

void main() 
{ 
    gl_FragColor = vec4(gl_FragCoord.x, gl_FragCoord.y, gl_FragCoord.z, 1.0); 
} 

Es gibt Objekte mit unterschiedlicher Position in der Szene, so dass die Werte in Z-Buffer sollten variieren.

Es ist seltsam, dass gl_FragCoord.x, gl_FragCoord.y und gl_FragCoord.z1.0 für alle Fragmente zu sein scheint, während gl_FragCoord.w für verschiedene Fragmente zu variieren scheint.

Wenn ich gl_FragCoord.w verwenden:

#ifdef GL_ES 
precision highp float; 
#endif 

void main() 
{ 
    float zbuffer = gl_FragCoord.w * 500.0; 
    gl_FragColor = vec4(zbuffer, zbuffer, zbuffer, 1.0); 
} 

Es scheint, die Z-Buffer Bild zu sein:

enter image description here

So würde warum gl_FragCoord.w vertreten Tiefeninformation während gl_FragCoord.z immer 1.0 für alle Fragmente ist?

Antwort

14

gl_FragCoord ist in Fensterfläche. Und window space ist in Pixel-Koordinaten des Fensters. Daher werden praktisch alle Fragmente Werte von> 1,0 haben. Und da Sie fast sicher nicht zu einem Fließkomma-Framebuffer rendern, werden Ihre Farben auf den Bereich [0, 1] beschränkt.

gl_FragCoord.z ist wahrscheinlich nicht 1.0, aber es kann nah genug sein, abhängig von Ihrem Tiefenbereich und wie weit die Objekte von der Kamera entfernt sind. Wenn Sie eine genaue Vorstellung von der Tiefe erhalten möchten, müssen Sie linearize it.

+1

Wie bekomme ich Bildschirmbreite und -höhe im Shader? – Ovilia

+0

@Ovilia: So wie du jeden anderen Wert hast: mit Uniformen. –

+0

Aber warum variiert 'gl_FragCoord.w' für verschiedene Fragmente? – Ovilia