作者:陈寅初
曾几何时,人们为了在屏幕上能实时显示几个有深度感的方块而欢呼雀跃,1993 年经典游戏 DOOM 问世的时候,游戏业界媒体发表了大量围绕该游戏的报道,除了通关攻略外,对游戏开发人员、游戏技术都进行了全方位的报道,原因无他——这是当时第一个能在个人电脑上以实时三维方式渲染的第一人称网络游戏,在游戏图形史上的地位举足轻重。
自此以后,围绕电脑实时三维渲染图形的技术和应用开始铺天盖地的涌现,CPU 方面首先发力,拥有更强浮点性能以及 SIMD 的 Pentium II 问世,不过 CPU 毕竟主要负责逻辑代码的处理,游戏只是众多任务之一。
因此为了实现更快的实时渲染性能,人们又推出了专门针对游戏图形加速芯片,3Dfx、NVIDIA、ATi、S3 等等众多(还有许多现在已经消失的)显卡厂商都在此时兴风作浪。最终,经过激烈的市场竞争,到了 2002 年的时候,随着 NVIDIA 收购 3dfx,显卡竞争厂商也就剩下两家:NVIDIA 以及 2005 年被 AMD 收购的 ATi。
受制于芯片面积的缘故,人们往图形芯片堆放的功能并非一步到位,对速度追求的优先度总是优先于功能。
例如早期的游戏图形芯片也就是实现了三角形设置、贴图、颜色混合这三个功能,在这之后才是逐渐加上顶点变换(例如 NVIDIA Celsius摄氏,Celsius是架构代号,代表芯片是全球第一枚 GPU NV10,例如采用 NV10 的 GeForce 256)、多采样抗锯齿(例如 NVIDIA Kelvin开尔文)、可编程着色器(例如 NVIDIA Kelvin开尔文)、高级语言通用计算(NVIDIA Tesla特斯拉)、统一架构(NVIDIA Tesla特斯拉)、曲面计算(NVIDIA Fermi费米)等特性。
不过在 GPU 功能、性能不断提升的日子里,业界一直伴随着一种声音:什么时候可以实现光线追踪渲染呢?
现在的游戏绝大多数都是采用名为光栅渲染的技术,而光线追踪则和光栅渲染有不少区别,在过去它都是离线渲染才会使用的渲染技术,不过到了今年,NVIDIA 公司却公布了首款具备专门光线追踪硬件加速的微架构——图灵Turing,这标志着沿用了 20 多年的游戏渲染技术终于迎来了首次真正意义上的革命,人们得以尝试基于物理的实时渲染加速。
看到这里,相信有些人已经有点看不下去了,因为上面引出一堆诸如光栅化渲染、光线追踪的学术名词。好在这些东西解释起来其实并不是很复杂,接下来我会尝试用最短的篇幅来介绍,务求大家看完后能知道基于图灵架构的显卡是否就是自己要买的那块显卡。
PC 上比较著名的早期三维游戏《德军总部 3D(Wolfenstein 3D)》使用的是名为光线投射(Ray Casting)技术实现的,它的原理是在某种几何尺度限制的前提下进行光线投射和追踪。例如,显示器的分辨率是 320×200 个像素的话,光线投射器只追踪 320 条光线(因为水平像素分辨率只有 320 个)。
在大多数情况下,这种渲染方式的方程并不准确(例如不进行场景光线递归),渲染品质不是很真实(稍微凑近看到的都是斑块),但是速度比较快。除了德军总部 3D 外,Raven 公司的 Shadow Caster、Bethesda 公司的 Arena、前面提到的 id Software 的 Doom 以及卢卡斯公司的 Dark Forces 都采用了 Ray Casting 技术。
光栅化渲染
现在的游戏都采用了名为光栅化(rasterization)的方式进行渲染,在光栅化渲染流水线上,同一时间内都是在画一个三角形。
这个三角形需要先经过计算确定其大小和位置,然后到了光栅器上,由光栅器计算出有哪些像素被其覆盖以及在被覆盖像素上的投影面积。
光栅化渲染的好处是快速,例如渲染大场景的时候,因为理论上每次渲染的时候内存里只要存放一个三角形的信息即可,三角形的属性维护可以在寄存器或者高速缓存里进行,这样能减少内存传输;只需要渲染被当前三角形覆盖的像素即可,如果配合一些隐面消除技术,还可以减少需要渲染的三角形数量。
问题是,光栅化每次都只渲染一个三角形,很多效果其实至少需要两个三角形才能实现,例如把三角形的阴影投射到另一个三角形上、三角形和另一个三角形的倒影、场景中所有三角形的光照反射等等。
光栅化渲染要实现复杂特效来模拟真实世界需要用上许多技巧,而这些技巧有时候会彼此之间存在冲突,需要另外的技巧来避免,这使得光栅化渲染在实现高级特效的时候会相当复杂,使得渲染器的编写、维护成本日益高昂。
光线追踪渲染
光线追踪(Ray-Tracing)就是一种用射线来确定不同元素可见性的渲染方法,它的实现原理相当简单,用 C++ 语言写成代码的话,完全可以放到一张名片上(最初的实现来自这里):
这张卡片上的代码可以以光线追踪的渲染方式画出下面的效果:
这里插播一个视频,也许能让你对实时光线追踪能达到的效果有更直观的了解。
光线追踪的方式可以分为正向光线追踪(从场景里的光源发射光线)和逆向光线追踪(从观察者或者说眼部、摄像机灯发射光线)。
现在人们一般所指的光线追踪算法,都是采用逆向光线追踪方式,让光线从“眼部(或者说’相机’)”发射,穿过屏幕上像素栅格进入场景中,直至找到最近的物体,确定与物体的交汇点,这个动作被称作求交。
光线追踪的第一次求交和德军总部 3D 采用的光线投射渲染方式是一样的,但是光线投射不会做接下来的反射、折射等光线递归处理。
此时,这条光线可能会被物体吸收、折射、反射,也可能会落入到阴影(交汇点和光源之间存在遮挡物)中,根据物料和光照等条件,交汇点会被着色器画上相应的颜色。对于存在折射、反射、阴影的情况,需要再从交汇点发射光线,直到遇到吸收表面、或者抵达场景极深处,完成递归。
光线追踪求交后,出现需要遍历场景其余三角形而发射的射线被称作次生射线(Secondary Ray),包括反射射线、折射射线、阴影射线。
此时,该像素的颜色最终确定下来了。
比较有趣的是,虽然我们现在觉得正向光线追踪是最自然的光照原理,但是从诞生时间上来说,逆向光线追踪理论诞生得最早,它可以追溯到公元前五世纪古希腊哲学家恩培多克勒提出的古怪理论。
和当时的许多希腊人一样,恩培多克勒认为万物都是由火、空气、泥土、水构成的,但是他相信希腊爱神阿芙洛狄蒂将人类的眼球独立于四种元素之外,并在其中点燃了火光,这些火光从眼部射出,使得人们有了视觉。
而正向光线追踪是到了公元 11 世纪左右才由阿拉伯科学家海什木提出,他认为我们之所以能看到物体,是因为来自太阳的光线:以直线方式行进的微小颗粒流从物体反射到我们眼中。
由于场景中的光源发出的绝大部分光线不会在观察者看到的光线中占很大比例,因此逆向光线追踪在效率上要比正向光线追踪高很多倍。
光线追踪的目的是要构建出整个场景的可视信息以及光照条件,藉此计算出光线和场景中物体相交时光线的反射、折射、吸收、遮挡信息,但是一般来说,它并不怎么考虑漫反射的情况,而且物体表面的属性相对单一。
对于漫反射,人们也会使用辐射度算法实现,当然,这和光线追踪并不矛盾,辐射度可以在光栅化和光线追踪渲染流水线中应用,例如 EA 的游戏战地三就用了辐射度来模拟全局光照。
相对于光栅化渲染速度快但是复杂的特点而言,光线追踪则刚好相反,它的渲染算法比较简单,但是要实现逼真的效果,是需要大量的计算才能实现,与光线追踪的技巧主要是如何实现节省计算资源和减少内存存取上。
上面两张图分别是在 DirectX 12 中的光栅化渲染流水线(简化)和光线追踪流水线,你可以看出两者在输入、前端处理、中段渲染上是很不一样的。
我们在这里说了一大堆看上去比较理论的东西,目的是为了下面的图灵架构介绍可以更简单明了,因为像光栅化这样的渲染框架其实对于许多人来说也是不清楚的,更不要说又冒出了个光线追踪出来,而光线追踪中能加速的部分正是图灵架构的重大革命。
这谁写的,还能不能让人开开心心的看了……
为啥不能开心看啊?
听说这次不怎么样?
教材级
这是英伟达的工程师退休后来爱活当编辑了么?
厉害了
纠个错,第二页最后一张图上面的“每个子核可以每个周期执行一个 Warp 或者说 32 个单精度 FMA 操作”应该是“32 个指令操作才对”吧,没SM只有16FP+16INT,要双周期才能跑一个Warp的fp32 FMA啊
第五页内容自适应着色部分的配图错了吧
感觉超过了anandtech
没看完先mark
666666
爱活网把开箱文写成了航空母舰,这是要上天啊
太可怕了
我不是针对谁,其他站的图灵文相比之下都是。。。。。
火钳刘明
爱活又出了一篇全网模板
炸裂了
ngx有意思
原来rtc和s“m”是一一对应的
原来rtc和sm是一一对应的
终于搞明白了smx tpc smm的区别,赞
我有个问题,以前把Pixel Shader和Vertex Shader合到一起都费牛劲,现在又分开成RT Core和CUDA Core,那不是又效率低了么 ?
因为是简单且”大量”重复的操作,做成硬线后,性能耗电比会高很多呀,你可以把 RT Core 想象成纹理单元之类的东西,更重要的是,raytracing 这个东西以后就是趋势,RT Core 不像着色器那样每个开发人员都有不同的想法,它集成的就是很简单的操作。
vs/ps分离设计也很有效率。rtcore应该打散融入smx,公用寄存器才是最理想的?
原来光追是集成在各sm里的?
Volta是NV竞标美国超算中标之后,专门为橡树岭SUMMIT做的,不用来给消费端很正常吧
文章规格上我有问题,之前我跑GP10x L1跑出来都是16k,哪有宣称的32k/64k?
值得其他媒体小编抄袭
不亚于当年的zen评测
跪着看完了,比学校讲的透
不明觉厉
我操,神作
哇,小纯觉得好厉害
沙发?
神作
重点是光线追踪游戏什么时候可以玩到
9999元的荣光
光学追踪这么厉害的吗?
卧槽,炸裂了