首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于所有像素,gl_FragCoord.x,y,z为1,w为深度

对于所有像素,gl_FragCoord.x,y,z为1,w为深度
EN

Stack Overflow用户
提问于 2013-03-01 13:22:53
回答 1查看 13.5K关注 0票数 8

我正在使用带有着色器的THREE.js。我正在尝试获取zbuffer信息。

顶点着色器:

代码语言:javascript
复制
// switch on high precision floats
#ifdef GL_ES
precision highp float;
#endif

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

片段着色器:

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-01 13:32:52

gl_FragCoord在窗口空间中。并且window space在窗口的像素坐标中。所以实际上你所有的片段都会有大于1.0的值。由于您几乎肯定不会渲染到浮点帧缓冲区,因此您的颜色将被限制在0,1范围内。

gl_FragCoord.z可能不是1.0,但它可能足够接近它,这取决于您的深度范围以及对象离摄影机的距离。如果你想真正了解它的深度,你需要使用linearize it

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15151076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档