2013-03-01 56 views
6

我使用THREE.js着色器。我正在嘗試獲取zbuffer信息。gl_FragCoord.x,y,z對於所有像素是1,而w是深度

頂點着色器:

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

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

片段着色器:

#ifdef GL_ES 
precision highp float; 
#endif 

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

有與場景中的不同位置的物體,因而在zbuffer值應有所不同。

很奇怪的是,gl_FragCoord.xgl_FragCoord.ygl_FragCoord.z似乎是1.0所有片段,而gl_FragCoord.w似乎針對不同的片段而有所不同。

如果我使用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); 
} 

這似乎是zbuffer圖像:

enter image description here

那麼,爲什麼gl_FragCoord.w被代表深度信息,而gl_FragCoord.z總是1.0所有片段?

回答

14

gl_FragCoord是在窗口空間。並且window space位於窗口的像素座標中。所以幾乎所有的片段都將具有> 1.0的值。而且由於你幾乎肯定不會渲染到浮點幀緩衝區,所以你的顏色將被限制在[0,1]範圍內。

gl_FragCoord.z可能不是1.0,但它可能足夠接近它,具體取決於您的深度範圍以及對象距離相機有多遠。如果您想深入瞭解真正的想法,您需要linearize it

+1

如何在着色器中獲取屏幕寬度和高度? – Ovilia 2013-03-01 05:38:48

+0

@Ovilia:和其他任何價值一樣:穿制服。 – 2013-03-01 05:56:38

+0

但爲什麼'gl_FragCoord.w'因不同的片段而異? – Ovilia 2013-03-01 13:54:07

相關問題