gpt4 book ai didi

c++ - 为什么 gl_FragCoord.z 不同于 ((pos.z/pos.w) + 1.0) * 0.5?

转载 作者:行者123 更新时间:2023-11-28 04:40:32 27 4
gpt4 key购买 nike

有谁知道为什么“深度”(vertShader) 不同于“gl_FragCoord.z”(从 opengl 渲染)?特别是随着 z 的减小,差异变得更大。 “深度”是否有可能在更高的 z 值下更精确?

.vsh
out float depth;
void main (void) {
vec4 pos = mvpMatrix * vertex;
depth = ((pos.z / pos.w) + 1.0) * 0.5;
gl_Position = pos;
}

.fsh
in float depth;
void main(void) {
gl_FragDepth = depth;// or gl_FragCoord.z;
}

最佳答案

您的方法存在一些问题,主要是:

  1. gl_FragCoord.z 是双曲线扭曲的窗口空间 z 值。但是,每个顶点的超倾斜 z/w 值只是线性在每个片段的屏幕空间中插值。但是,当您使用变化的 out float depth = (pos.z/pos.w) 时,GL 将进行非线性的透视校正插值。您可以通过使用 flat out float depth 来解决这个问题。

  2. (pos.z/pos.w) 甚至没有意义。想一想:如果点位于相机所在的平面内,您将得到 pos.w=0,并且没有有效结果。 gl_FragCoord.z 没有这个问题,因为裁剪是在分割之前完成的,它会分割位于近平面上的新顶点,而你永远不会看到它(没有为此调用顶点着色器)。

    当点位于相机后面时也会出现此问题,它们最终会镜像到相机前面。如果您有一个顶点位于相机两侧的图元,那么无论您选择哪种插值方法,您都将完全胡说八道作为插值的 depth 值。

关于c++ - 为什么 gl_FragCoord.z 不同于 ((pos.z/pos.w) + 1.0) * 0.5?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50256568/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com