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.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图片:

那么为什么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 为深度的主要内容,如果未能解决你的问题,请参考以下文章

gl_FragCoord 的范围是多少

在 SKShader 中使用父坐标

Effective java -- 2 对于所有对象都通用到方法

Effective Java2读书笔记-对于所有对象都通用的方法

迭代 3D 数组的 Pythonic 方式

dfs 无向图两节点间的所有路径