2013-03-01 13 views
6

Używam THREE.js z modułem cieniującym. Próbuję uzyskać informacje zbuffera.gl_FragCoord.x, y, z jest 1 dla wszystkich pikseli, a w jest głębokością

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); 
} 

Są to obiekty o różnej pozycji na scenie, a tym samym wartości w zbuffer powinna różnić.

To dziwne, że gl_FragCoord.x, gl_FragCoord.y i gl_FragCoord.z wydaje się być 1.0 dla wszystkich fragmentów, podczas gl_FragCoord.w wydaje się różnić dla różnych fragmentów.

Jeśli używam gl_FragCoord.w:

#ifdef GL_ES 
precision highp float; 
#endif 

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

Wydaje się, że obraz zbuffer:

enter image description here

Więc dlaczego gl_FragCoord.w reprezentować szczegółowych informacji podczas gl_FragCoord.z jest zawsze 1.0 dla wszystkich fragmentów?

Odpowiedz

14

gl_FragCoord jest w miejsce na okno. I window space jest we współrzędnych pikselowych okna. Zatem praktycznie wszystkie twoje fragmenty będą miały wartości> 1,0. A ponieważ prawie na pewno nie renderujesz do framebuffera zmiennoprzecinkowego, twoje kolory zostaną zaciśnięte w zakresie [0, 1].

gl_FragCoord.z to prawdopodobnie nie 1,0, ale może być dostatecznie blisko, zależnie od zakresu głębi i odległości obiektów od kamery. Jeśli chcesz uzyskać prawdziwe pojęcie głębi, musisz linearize it.

+1

Jak uzyskać szerokość i wysokość ekranu w module cieniującym? – Ovilia

+0

@Ovilia: W ten sam sposób, w jaki robisz jakąkolwiek inną wartość: z uniformami. –

+0

Ale dlaczego "gl_FragCoord.w" jest różne dla różnych fragmentów? – Ovilia