2013-03-01 7 views
6

Sto usando THREE.js con shader. Sto cercando di ottenere le informazioni su zbuffer.gl_FragCoord.x, y, z è 1 per tutti i pixel e w è la profondità

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

Ci sono oggetti con posizione diversa nella scena, ossia i valori nella Zbuffer dovrebbero variare.

È strano che gl_FragCoord.x, gl_FragCoord.y e gl_FragCoord.z sembra essere 1.0 per tutti i frammenti, mentre gl_FragCoord.w sembra variare per i diversi frammenti.

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

Sembra essere l'immagine Zbuffer:

enter image description here

Quindi, perché gl_FragCoord.w rappresenterà informazioni di profondità, mentre gl_FragCoord.z è sempre 1.0 per tutti i frammenti?

risposta

14

gl_FragCoord è in spazio finestra. E window space è in coordinate pixel della finestra. Quindi praticamente tutti i tuoi frammenti avranno valori> 1.0. E dal momento che quasi certamente non si esegue il rendering in un framebuffer a virgola mobile, i colori verranno bloccati nell'intervallo [0, 1].

gl_FragCoord.z probabilmente non è 1.0, ma potrebbe essere abbastanza vicino, in base alla gamma di profondità e alla distanza dalla fotocamera. Se vuoi avere una vera idea della profondità, devi linearize it.

+1

Come è possibile ottenere la larghezza e l'altezza dello schermo nello shader? – Ovilia

+0

@Ovilia: nello stesso modo in cui fai qualsiasi altro valore: con le uniformi. –

+0

Ma perché 'gl_FragCoord.w' sta variando per diversi frammenti? – Ovilia