为什么 gl_FragCoord.z 与 ((pos.z / pos.w) + 1.0) * 0.5 不同?
Why differs gl_FragCoord.z from ((pos.z / pos.w) + 1.0) * 0.5?
>有谁知道为什么"深度"(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;
}
您的方法存在几个问题,重点是:
-
gl_FragCoord.z
是双曲线扭曲的窗口空间 z 值。但是,每个顶点的双斜z/w
值只是在每个顶点的屏幕空间中线性插值。但是当你使用一个变化的out float depth = (pos.z / pos.w)
时,GL将进行非线性的透视校正插值。您可以使用flat out float depth
来解决此问题。 -
(pos.z/pos.w)
甚至没有意义。想一想:如果点在相机所在的平面上,你会得到pos.w=0
,并且没有有效的结果。gl_FragCoord.z
没有这个问题,因为裁剪是在分割之前完成的,它将对位于近平面上的新顶点进行分割,并且您永远不会看到(没有顶点着色器调用(。当点位于相机后面时,也存在问题,它们最终会镜像到相机前面。如果你有一个基元,其中顶点位于相机的两侧,无论你选择哪种插值方法,你都会得到完全的废话作为你的插值
depth
值。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 从不同线程使用int64的不同字节安全吗
- valgrind-hellgrind与泄漏检查的结果不同
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 函数向量_指针有不同的原型,我可以构建一个吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 访问者访问变体并返回不同类型时出错
- #为""定义宏;静态";针对不同的上下文
- 不同翻译单元中不可重载的非内联函数定义
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过继承类使用来自不同命名空间的运算符
- 我想做一个彼此不同但重复出现的数字
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- c++类声明时,相同的例程,不同的成员变量类型
- Python中的for循环与C++有何不同
- 为测试目标创建具有不同源文件夹的文件
- 为什么 gl_FragCoord.z 与 ((pos.z / pos.w) + 1.0) * 0.5 不同?