gl_FragCoord.x, y, z 对于所有像素为 1,w 为深度
Posted
技术标签:
【中文标题】gl_FragCoord.x, y, z 对于所有像素为 1,w 为深度【英文标题】:gl_FragCoord.x, y, z being 1 for all pixels and w being the depth 【发布时间】:2013-02-15 13:28:15 【问题描述】:我正在使用带着色器的 THREE.js。我正在尝试获取 zbuffer 信息。
顶点着色器:
// 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.x
、gl_FragCoord.y
和gl_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图片:
那么为什么gl_FragCoord.w
代表深度信息,而gl_FragCoord.z
对于所有片段总是1.0
?
【问题讨论】:
【参考方案1】:gl_FragCoord
在窗口空间中。 window space 在窗口的像素坐标中。因此,几乎所有片段的值都 > 1.0。而且由于您几乎可以肯定不会渲染到浮点帧缓冲区,因此您的颜色将被限制在 [0, 1] 范围内。
gl_FragCoord.z
可能不是 1.0,但它可能足够接近它,具体取决于您的深度范围以及物体与相机的距离。如果你想真正了解深度,你需要linearize it。
【讨论】:
如何在着色器中获取屏幕宽度和高度? 但为什么gl_FragCoord.w
会因片段不同而不同?
@Ovilia:出于与其他三个组件相同的原因。不同之处在于您没有看到它。
另外,如果有人问为什么w
有深度,实际上根据标准它有“1/z”,但z
远高于 1,所以把@ 987654328@ 值在 0-1 范围内。远深度会产生较暗的像素,低深度会产生较亮的像素,这就是 OP 获得这些结果的原因。以上是关于gl_FragCoord.x, y, z 对于所有像素为 1,w 为深度的主要内容,如果未能解决你的问题,请参考以下文章
Effective java -- 2 对于所有对象都通用到方法