颠覆性的光线追踪算法.历史性的突破.秒杀一切现有算法.
本帖最后由 adsl2048 于 2010-6-9 15:52 编辑(一)
先做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.必须做交点剔除。
先做剔除是因为资源压力。由于资源压力,还必须分块处理。
欢迎大家探讨斧正拍砖!
其实整个算法非常好理解,你可以看成是一个“球”投影到了z缓冲区上一样。这个“球”是透明的,它里边还有其他的三角形构成的物体。由于你的分辨率够高,所以你决定要把这个“球”里边的所有三角形,各种线等画到你的“z缓冲区”上来。。。 有没有实际的演示demo,代码或者参考出处? 回复 3# FontainebleauV
没有,这是今天才发表的新算法思路。。。有兴趣的各位大侠可以试验一下。。。 z-buffer 的精度恐怕无法满足这么多次迭代。 本帖最后由 adsl2048 于 2010-6-8 17:54 编辑
z-buffer 的精度恐怕无法满足这么多次迭代。
Edison 发表于 2010-6-8 17:47 http://we.pcinlife.com/images/common/back.gif
多谢爱迪生大驾光临。。。我觉得应该可以吧32位很长了。况且,不是镜面反射的话光衰很严重吧?递归深度超过3有意义么?请指导。。。
块状渲染处理呢?能缓和嘛?
实在是不行,只有上40位的z精度了。。。
还有,其实“球体”中的z是+-32的。。。 目前应该还没有 GPU 支持硬件 40-bit z-buffer。 本帖最后由 adsl2048 于 2010-6-9 00:26 编辑
目前应该还没有 GPU 支持硬件 40-bit z-buffer。
Edison 发表于 2010-6-8 23:41 http://we.pcinlife.com/images/common/back.gif
只是说笑而已。。。关键是我觉得32bit也足够了。。。投影缓冲区足够大的话精度问题还是完全在容忍的范围之内的。
你看第二步就知道问题不大,因为是先做ray的投射的。那么其实就等于说“投影缓冲区”的点阵上是先有ray的z值的,而后投影的三角形通常都是面向量,通常都能“覆盖”。即使边缘因为精度问题而少反射那么条把ray,其实对整个视觉效果来说是没什么大的影响的。
毕竟这个算法是面向实时游戏的而不是静态图片的。精度问题随日后硬件发展会自然解决掉的假如有的话。 目前应该还没有 GPU 支持硬件 40-bit z-buffer。
Edison 发表于 2010-6-8 23:41 http://we.pcinlife.com/images/common/back.gif
你对dc和cuda非常有编程经验,你能测试一下这个算法在gpu上的效果嘛? 科技突破无止境,目前看来CUDA需要更多的推广。 多次反射的颜色改变,你记在哪了? 回复 11# linkto
解决的是求交问题先。记录问题只是小问题。通过最后的递归才能得到。 本帖最后由 adsl2048 于 2010-6-9 15:58 编辑
好吧,我们进一步把问题简化,就是能通过“z buffer”的来计算屏幕中球体内的各线段和物体的相交嘛?。(线段不会超出球,物体也绝不超出球)。球外什么都没有,不用考虑。
这个特殊的“z buffer”可以存储线信息,三角形信息,和z值。算法被改成比较的不是大小,而是相等。。。实际要保留的是相等的z的三角形信息和z值。。。因为代表在这一点上有相交。
ok。举个例子----先在球体中生成一条线段。投射到z buffer上。再生成一个三角形,“投射到这条线段上”。此时z buffer比较的不是大小,而是z是否相等。
相等那一点的,留下交点信息。不等的去掉。 由于人眼的分辨率是有限的。所以z超过某个值之后,物体本身不够大的话。它们之间的反射根本不敏感。
所以,可以设计一个阀值=“(z距离)x(三角形在z buffer中的面积)”。小于这个阀值之后。根本就不管反射线只管阴影。
然后剩余的点反射ray的长度=这个(z距离)。但是阴影线长度还是点到光源的距离。
那么所以这个3d空间的范围缩小为以z buffer相机位为中心,这个(z距离)为半径的一个球体。所有超出这个“球体”的三角形都认定为不反射。但是超出这个球体的光源到点的阴影线一样要计算。显然这个“球体”“远小于”真正的3空间。
那么由于这个“投影点阵”又和z buffer完全平行,而“投影点阵”的相机位和z buffer的相机位又在一条直线上。所以有了这个长度距离,我们就可以确定投影点阵的相机位。
那么“两世界坐标的转换”就没必要进行。。。其实就相当于你在3d空间中自己直线后退了一段距离,然后从“投影相机位”看“z buffer”“这幅画”的ray情况。。。
那么此时View Clipping就和“投影点阵”完全重合,大小相等。超出此时View Clipping的三角形在“比较完阴影线之后”终于也不进入比较了。。。 我举个例子来说明。比如生活中有个鸟在天上飞,它应该在底面上有个阴影。但实际生活中我们却很少看到。
因为鸟太小了也太远了,她造成的阴影根本上被阳光“覆盖”掉了。或者不在我们所看到的区域内。 光线在游戏中,到底是如何表现的哦? 光线在游戏中,到底是如何表现的哦?
andyliu780303 发表于 2010-6-28 08:38 http://we.pcinlife.com/images/common/back.gif
你问得很笼统。假如你问的是那些投影点阵上的光线在游戏中是如何表现的。答案就是那是计算用的。在游戏画面中看不到。 现在我们来解决这个算法中最关键的地方,就是z精度问题。通过比较z相等的做法其实是不可靠的,但是为了初步的说明算法的求交方式,先那样说便于理解。
因为很有可能恰好三角形和光线的交点没有投影。能投影的是三角形略大或略小的点值。但是我们可以设计这么一个方法来解决这个问题。就是if 三角形“投影点的z值减去线对应点的z值”,(此时减法后得出的绝对值)小于一个阀值时,记录下这个三角形点值。因为说明三角形那一点和线的点挨得非常近。
那么就有。假如线和三角形相较,那么三角形和线重叠的部分必有两点z做减法之后正负符号相反。假如符号不相反就是不相交。假如减法结果为0也相交。用文字表述非常累赘。画图说明:
本帖最后由 adsl2048 于 2010-6-30 17:38 编辑
为了更加快速的计算,可以不做减法,只做“重叠部分”z比较。只要同一三角形有两点满足》=线z and 《=线z即为相较,其他情况则不相交。
这个哪种更快我就不得而知了。 看了才明白啊 微型计算机刊载过关于光线追踪技术的文章 上面的图片可以用华丽来形容
不过目前的GPU无法进行光线追踪运算 现阶段专用的处理器也只能达到4--6帧每秒
光线追踪要走的路还很远 但是前途一片光明 算法是面向实时游戏的而不是静态图片的。精度问题随日后硬件发展会自然解决掉的假如有的话。 本帖最后由 zhjecho 于 2010-9-15 12:32 编辑
Ray Tracing的两大问题,这个算法是不是能解决头一个?能带来多少速度提升?
1) 占运算时间70%的求交算法速度
2) BRDF有更好的近似模型了吗?如果还是Phone和Ward改改参数,那也还是搞不出多好的效果 本帖最后由 adsl2048 于 2010-9-23 11:58 编辑
Ray Tracing的两大问题,这个算法是不是能解决头一个?能带来多少速度提升?
1) 占运算时间70%的求交算法速 ...
zhjecho 发表于 2010-9-15 12:28 http://we.pcinlife.com/images/common/back.gif
也不能说是解决,只是算法更适合gpu的特性,可以大幅度提高求交速度。特别是不需要构建加速结构这点是传统算法不能比拟的。
传统的算法由于需要建立加速结构,对于动态画面是非常不合适的。每一帧都要重新构建加速结构。比如有一列火车或者火箭炮弹经过视角,视角又是可操控的。那么炮弹或者火车这个多边形在加速结构中的位置就得不断变化。否则视角有变化的话,追踪结果就无法计算。所以不每一帧都更新加速结构是行不通的对于传统算法来说。
每一帧都重构加速结构的话,消耗太大了。特别是多边形多的情况下。
算法的意思跟上图差不多,可能文字表述有错误。
1.投影点阵(A buffer性质)先存储所有要比较的ray投影值。
2.假如一个三角形在同一点有投影,先做一次“减法测试”得出正负符号,然后其他“同投影点”做“减法测试”比较,看看运算结果是否符号相反。相反即相交,求交点值存储即可。
不相反即不相交,什么都不做。
3.由于运算中,一条ray方向上可能跟几个三角形相交,所以存储时比较存储结果,离ray原点近的为“第一交点”。替换存在的值即可。
由于不再以“z”相等作为判断依据。那么这个投影点阵的分辨率就可以很低。比如320*240。这样可以大大减低存储压力。
页:
[1]
2