我有一个问题,将世界坐标移动到ndc坐标,而不是用它计算一些东西,并将它移回着色器内。
“守则”的内容如下:
vec3 testFunc(vec3 pos, vec3 dir){
//pos and dir are in worldspace, convert to NDC
vec4 NDC_dir = MVP * vec4(dir,0);
vec4 NDC_pos = MVP * vec4(pos,1);
NDC_dir /= NDC_dir.w;
NDC_pos /= NDC_pos.w;
//... do some caclulations => get newPos in NDC
//Transform newPos back to worldspace
vec4 WS_newPos = inverse(MVP) * vec4(newPos,1);
return WS_newPos.xyz / Ws_newPos.w;
}我在测试时发现,虽然NDC_dir.x和NDC_dir.y似乎是合理的,但NDC_dir.w和NDC_dir.z几乎总是相等的。因此,当除以"w“时,z值总是约为1,我认为这不应该是正确的?(NDC_pos也一样)。
另一方面,当我将"pos“转换为NDC,而不是将其转换回Worldspace (没有任何计算)时,它似乎得到了原来的点,这实际上意味着转换是正确的。
有人能告诉我如果我做错了什么吗,如果没有,为什么z值总是1?
更新:,这有点尴尬。“我有两个问题:一是方向问题,”阿恩指出。另一个只是我这边的缩放问题。我有一个非常小的近距离剪辑和一个很远的剪辑。由于这个值是对数的,我刚刚移动了两个大的步骤来实现z值实际上是从-1到1。
发布于 2015-11-24 15:36:27
我在测试时发现,虽然NDC_dir.x和NDC_dir.y似乎是合理的,但NDC_dir.w和NDC_dir.z几乎总是相等的。因此,当除以"w“时,z值总是约为1,我认为这不应该是正确的?(NDC_pos也一样)。
其实是的,应该是这样的。如果输入形式为{x,y,z,0},那么它将被解释为在{x,y,z}方向上无限远的一个点。因此,深度分量应该始终是最遥远的,如果是可见的。顺便说一句,一个无穷远的点仍然是平移不变的。
但是你应该知道,在NDC中,一个无限远的点可能不是你想要的。
三维空间中的向量对平移是不变的,它只是保持不变的矢量,因为矢量只有一个方向,而不是位置。这在扭曲的NDC中是不可能的。
如果你想转换一个向量,你最好转换两个点,然后再取NDC中的差值。但是你应该知道你的结果取决于你的职位。
https://stackoverflow.com/questions/33897004
复制相似问题