我将世界坐标移动到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(没有任何计算)时,似乎得到了原始Point,这实际上意味着转换是正确的。
有人可以告诉我这里是否做错了,如果没有,为什么z-Value总是1?
更新 这有点尴尬。我有两个问题:1。一个是方向问题@Arne指出。另一个只是我身边的缩放问题。我有一个非常小的近夹子和一个很大的夹子。由于该值是对数的,我只是采取了两大步骤来实现z值实际上从-1到1。
答案 0 :(得分:1)
我在测试时发现,当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。
3D空间中的矢量对于平移是不变的,它只是保持相同的矢量,因为矢量只有方向,而不是位置。在扭曲的NDC中,这实际上是不可能的。
如果你想变换一个矢量,你应该更好地变换两个点,然后再次在NDC中取得差异。但是你应该知道你的结果取决于位置。