用户
 找回密码
 立即注册
adsl2048 该用户已被删除
发表于 2010-6-8 16:08:00
1512716
(一)
先做z buffer,做z buffer的好处是1.可以省去第一次求交的运算。2.可以得出要显示的多边形。

(二)

通过计算所有z buffer后剩余点的坐标和法线,求出所有的反射折射ray和阴影线。并且把所有这些3d空间中的线投影到一个“投影缓冲区”中。。。

由于这些线在3d空间中是有z值的,所以投影之后会类似于z buffer缓冲中的多边形点一样,每条线在“投影缓冲区”点阵中都有一个直线的连续z值。


每条线本身是属于反射折射还是阴影的属性不变。

(三)gpu的顶点处理单元所生成的三角形,通过投影变换后得出了每个三角形面上的点的z值。好吧,再通俗点就是。每个三角形在这个“投影缓冲区”上也是“一片”z值点阵。

通过不断的透射这些点着到这个“投影缓冲区”点阵上,由于已经存在线z。。。所以当“同一点”的一个三角形的z值和某条线的z值一致时,这个三角形就和这条线相交。

(四)1.我们必须先做阴影线剔除。先处理阴影线,处理完后全部剔除。不再占用投影空间2.在新迭代的ray生成时,旧有的ray将被剔除。3.必须做交点剔除。


先做剔除是因为资源压力。由于资源压力,还必须分块处理。


欢迎大家探讨斧正拍砖!

[ 本帖最后由 adsl2048 于 2010-6-9 16:36 编辑 ]
使用道具 举报 回复
发表于 2010-6-8 16:09:29



其实整个算法非常好理解,你可以看成是一个“球”投影到了z缓冲区上一样。这个“球”是透明的,它里边还有其他的三角形构成的物体。由于你的分辨率够高,所以你决定要把这个“球”里边的所有三角形,各种线等画到你的“z缓冲区”上来。。。
使用道具 举报 回复 支持 反对
发表于 2010-6-9 14:46:31
crosly来发表一下观点吧
使用道具 举报 回复 支持 反对
发表于 2010-6-18 15:00:39
楼上的也发表下呗?
使用道具 举报 回复 支持 反对
发表于 2010-6-25 18:44:54
由于人眼的分辨率是有限的。所以z超过某个值之后,物体本身不够大的话。它们之间的反射根本不敏感。



所以,可以设计一个阀值=“(z距离)x(三角形在z buffer中的面积)”。小于这个阀值之后。根本就不管反射线只管阴影。



然后剩余的点反射ray的长度=这个(z距离)。但是阴影线长度还是点到光源的距离。



那么所以这个3d空间的范围缩小为以z buffer相机位为中心,这个(z距离)为半径的一个球体。所有超出这个“球体”的三角形都认定为不反射。但是超出这个球体的光源到点的阴影线一样要计算。显然这个“球体”“远小于”真正的3空间。

那么由于这个“投影点阵”又和z buffer完全平行,而“投影点阵”的相机位和z buffer的相机位又在一条直线上。所以有了这个长度距离,我们就可以确定投影点阵的相机位。


那么“两世界坐标的转换”就没必要进行。。。其实就相当于你在3d空间中自己直线后退了一段距离,然后从“投影相机位”看“z buffer”“这幅画”的ray情况。。。


那么此时View Clipping就和“投影点阵”完全重合,大小相等。超出此时View Clipping的三角形在“比较完阴影线之后”终于也不进入比较了。。。

[ 本帖最后由 adsl2048 于 2010-6-25 18:53 编辑 ]
使用道具 举报 回复 支持 反对
发表于 2010-6-25 18:49:28
我举个例子来说明。比如生活中有个鸟在天上飞,它应该在底面上有个阴影。但实际生活中我们却很少看到。

因为鸟太小了也太远了,她造成的阴影根本上被阳光“覆盖”掉了。或者不在我们所看到的区域内。
使用道具 举报 回复 支持 反对
发表于 2010-7-1 10:48:12
现在我们来解决这个算法中最关键的地方,就是z精度问题。通过比较z相等的做法其实是不可靠的,但是为了初步的说明算法的求交方式,先那样说便于理解。, `+w9X  s8e7|;E
5X(t#p) }1T)H0R/O
因为很有可能恰好三角形和光线的交点没有投影。能投影的是三角形略大或略小的点值。但是我们可以设计这么一个方法来解决这个问题。就是if 三角形“投影点的z值减去线对应点的z值”,(此时减法后得出的绝对值)小于一个阀值时,记录下这个三角形点值。因为说明三角形那一点和线的点挨得非常近。! f3g  U/w.U)J
*W#X0I3n+m
那么就有。假如线和三角形相较,那么三角形和线重叠的部分必有两点z做减法之后正负符号相反。假如符号不相反就是不相交。假如减法结果为0也相交。用文字表述非常累赘。画图说明:







[ 本帖最后由 adsl2048 于 2010-7-1 10:50 编辑 ]
使用道具 举报 回复 支持 反对
发表于 2010-7-1 10:51:27
为了更加快速的计算,可以不做减法,只做“重叠部分”z比较。只要同一三角形有两点满足》=线z and 《=线z即为相较,其他情况则不相交。

这个哪种更适合gpu我就不得而知了。
使用道具 举报 回复 支持 反对
发表于 2010-7-1 20:13:18
"每条线在“投影缓冲区”点阵中都有一个直线的连续z值"?
--> 你自己以为的吧!

  "所以当“同一点”的一个三角形的z值和某条线的z值一致时,这个三角形就和这条线相交."
--> 当一条直线几乎平躺在三角面上,距离极小,以至于由于机器浮点表示的精度限制被舍近为相同的值,那是相交还是不相交呢?我看是想交交不成,不想交翩翩娇吧_ _

    "我举个例子来说明。比如生活中有个鸟在天上飞,它应该在底面上有个阴影。但实际生活中我们却很少看到..."
--> 当大众脑残啊,这么简单的道理谁都懂,知道手术灯照在受术者身上为什么没有阴影吗? “鸟在天上飞”:LZ你在梦里游吧。
使用道具 举报 回复 支持 反对
发表于 2010-7-1 22:14:49
第一个问题,只能靠自行想象,比如在屏幕上画一条直线。在z buffer中就是连续的z值。但是有的线可能视角非常小。以至于才有一个点z值。但是由于投影精度可以设置为z buffer的10倍乃至100倍,所以实际上在z buffer中有一个像素表示的线可以有10个乃至100个点。

第二个问题,这么小的距离当然认为是相交的。而且后面补充的部分对判断有说明。至于为什么能认为是相交的,因为人眼分辨率精度对于这样小的距离可以看成是相交的。实际上这个算法为了追求速度是放弃了一些精准度,但是并不要紧。极限情况很少出现,至少你随便狗来的一张crysis都没有这么无聊的“三角形”存在。退一步说,即使存在,你都难以找出反射的错误。因为那可能只有一个像素点。

第三个问题不解释。传统的方法怎么解决手术灯问题,也一样可以用在这里。
使用道具 举报 回复 支持 反对
12下一页
发新帖
您需要登录后才可以回帖 登录 | 立即注册