glsl – gl_FragCoord.x,y,z为所有像素为1,w为深度

前端之家收集整理的这篇文章主要介绍了glsl – gl_FragCoord.x,y,z为所有像素为1,w为深度前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用着色器使用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,1.0);
}

它似乎是zbuffer图像:

那么为什么gl_FragCoord.w会表示深度信息,而gl_FragCoord.z对于所有片段总是1.0?

解决方法

gl_FragCoord在窗口空间中.并且 window space在窗口的像素坐标中.因此,几乎所有碎片都具有值> 1.0.由于您几乎肯定不会渲染到浮点帧缓冲区,因此您的颜色将被限制在[0,1]范围内.

gl_FragCoord.z可能不是1.0,但它可能足够接近它,具体取决于您的深度范围以及物体离相机的距离.如果你想深入了解深度,你需要linearize it.

原文链接:https://www.f2er.com/js/158425.html

猜你在找的JavaScript相关文章