浅谈光线追踪(上)

第一次写博客,算是记录下自己的学习心得,方便之后复盘。之前就有这个想法了,感谢实验室的小伙伴让我更加坚定了要加深对底层的了解,而不是一直把目光停留在抽象层。感谢玮哥大神的指导,虽然很遗憾和冬冬、杨闯、学明呆在一起的时间不长,但和大家在一起学习的时间真的很有意义,希望大家都有光明的未来。


2018年9月,NVIDIA发布了全世界第一款支持光线追踪的显卡RTX2080,依托于RTX光追显卡以及微软发布的Direct X Ray Tracing API,终于使诞生了50多年的光线追踪技术,可以在游戏中与玩家见面了。

那么什么是光线追踪呢?我们为什么要在游戏中使用光线追踪呢?开了光追之后为什么柚子的帧率比不开光追要低很多呢?

给大家介绍一下实时光线追踪的一些知识。

为了让大家能够更好的理解实时光追这项技术,我们先来简单的了解一下绝大多数现在游戏仍然在使用的光栅化技术,光栅化从广义上来说,就是把一个矢量图转换成位图的过程,矢量图就像是flash动画一样由数学公式描述的图像,他可以被无限放大,而不会出现锯齿和马赛克。而位图则是由一个一个像素拼接组成的图像,放大就会出现锯齿和马赛克。

现代游戏使用的光栅化技术就是用数学坐标描述的一大堆三角形组成的游戏场景。根据玩家摄像机的位置以及视角等参数,计算出这些三角形在屏幕上覆盖到了哪些像素点,然后再使用光源材质等信息来计算这些像素点的颜色,从而绘制出游戏的画面。

光栅化渲染管线通常需要的计算量不大,而且对于同一批次提交给GPU的三角形来说,三角形内部每个像素所需的计算量,都不会有太大的差别,因而非常适合进行大批量的并行计算,从而达到非常高的执行效率,所以光栅化技术在实时渲染的游戏领域一直都处于主导地位。

而光线追踪呢?顾名思义就是发射一堆虚拟的光线,然后追踪并记录这些光线与场景中物体之间碰撞的信息来生成画面的一种技术。

首先在场景里面找到一个点,然后从这个点的位置对着场景发射一堆射线,这一堆射线里的每一根射线。如果使用蛮力计算的方法,需要与场景中所有物体的所有三角面都要进行一次相交测试,才能确定这一根射线到底打在了场景中哪一个三角面上,这一部分的计算即使是使用包围体层级BVH这样的加速结构进行优化,需要的计算量也非常大。

而且游戏场景中的物体通常并不是均匀分布在游戏场景中的,这就导致计算每一条射线与场景物体。相交位置所需的计算量也是不固定的。然而这还没完,射线击中物体之后,通常会根据物体表面材质的不同,来进行不同程度程度的反射和折射。这时候通常就需要从击中点再朝一个或者多个方向继续发射射线来重复以上的过程,然后根据射线走过的路径,计算出每条射线所携带的高度颜色以及可见性等信息,最后再拿着这些信息使用一些图形学的算法,最终计算出画面中每个像素的颜色。

从上面的描述中不难看出,使用光线追踪来绘制游戏的画面。不仅所需要的计算量比光栅化要大很多,内存或显存的需求比光栅化要高很多。因为光追与光栅化不同的是光栅化可以把场景分割成一系列单独的几何体,这些单独的几何体又可以被一个个的提交给GPU进行绘制。而光线追踪从原理上就要求场景中所有的几何体,都必须提前放入内存或显存中才能参加相交测试,所以一直以来光线追踪都被应用在渲染图片或者影视特效这种纯离线渲染的领域。


感谢知乎、b站、git、csdn,尤其感谢刀客。。。。。。希望自己可以一直学习下去,一个礼拜出一期学习心得。

你可能感兴趣的:(光线追踪,图形渲染)