Home › Forums › GAMES在线课程(现代计算机图形学入门)讨论区 › 关于作业2和作业3中Z-Buffer的问题
- This topic has 10 replies, 5 voices, and was last updated 5 years, 1 month ago by
小木子.
-
AuthorPosts
-
-
Karlmeister
Participant通过下面这个函数可以得到三角形内一点在view space中的深度
float Z = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());
为什么比较和更新Z-Buffer数组的时候要用zp这个变量呢?
float zp = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();
zp *= Z;
在经过投影变换以后,v.w表示顶点在view space的深度,v.z不是已经没有意义了吗,为什么这里要把v.z当做一种属性值进行插值得到一个zp呢? -
Karlmeister
Participant我发现代码中如果v改成t.v,就会出问题,而所有v.w都是1…是不是这个t.v的坐标空间本身就有问题,xyz三个分量已经除过一次w,而w还是w没有变?所以我看大家求bounding box的时候也没有把齐次坐标里的w除去的样子。。
-
Karlmeister
Participant找到问题所在了,rasterize_triangle得到的三角形的顶点vector不是在齐次坐标系的坐标点,只有xyz三个值是除过w的,w保持不变。。。所以bounding box和后面公式里都用的是v的xyzw,且强制auto v = t.toVector4,即v.w恒为1。。。实在不明白为什么要这么写
Attachments:
You must be logged in to view attached files. -
叮叮咣咣
Participant相同的疑惑,感觉有问题
-
楼主搞明白了吗?为啥zbuffer的插值和齐次坐标最后一项有关系呢
-
star
Participant-
star
Participant -
那为什么w的初始化是1呢??三个顶点的深度值就一样?一定是1?
-
-
而且框架代码里算出来的w_reciprocal一直都是1,这没有异常吗?
This post has received 1 vote up. -
大家在这里集合,这位答主的长文和我的观点一致,作业框架里的吧w恒定为1的做法是一种近似(简化到把重心插值误差修正的算法效果给简化没),导致作业2中的w_reciprocal,作业3中的Z,论文中的Zt都是1,导致的结果就是误差修正的效果全部消失,还是使用了屏幕上的点所在位置去做了插值计算,并没有修正到view space中真正正确的点上
This post has received 1 vote up.
-
-
AuthorPosts
- You must be logged in to reply to this topic.