Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Glsl gl_FragCoord.x,y,z是所有像素的1,w是深度_Glsl_Three.js_Webgl_Shader_Zbuffer - Fatal编程技术网

Glsl gl_FragCoord.x,y,z是所有像素的1,w是深度

Glsl gl_FragCoord.x,y,z是所有像素的1,w是深度,glsl,three.js,webgl,shader,zbuffer,Glsl,Three.js,Webgl,Shader,Zbuffer,我正在使用带有着色器的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

我正在使用带有着色器的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\u 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\u FragCoord.w
表示深度信息,而
gl\u FragCoord.z
对于所有片段总是
1.0

gl\u FragCoord
位于窗口空间中。在窗口的像素坐标中。因此,实际上所有片段的值都将大于1.0。由于您几乎肯定不会渲染到浮点帧缓冲区,因此颜色将被限制在[0,1]范围内


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

如何在着色器中获得屏幕宽度和高度?但是为什么
gl_FragCoord.w
会因不同的片段而变化?@Ovilia:原因与其他三个组件相同。区别在于你看不到它。此外,如果有人问为什么
w
有深度,实际上根据标准它有“1/z”,但是
z
比1高得多,因此
w
的值在0-1范围内。深度较远的像素颜色较深,深度较低的像素颜色较亮,这就是OP获得这些结果的原因。