所以我想知道像Unity3D和幻影这样的游戏引擎是如何进行照明的。我熟悉光线追踪,基于路径跟踪的渲染器等,但不太熟悉基于光栅化的引擎。我确实对OpenGL的管道和诸如顶点和片段着色器之类的东西有一个大致的概述,但是我不知道颜色是如何计算出来的。
我猜基于栅格化的管道使用同样的程序来遮阳,即从像素上射出一条射线,然后从那个像素上投射到光源上的三角形?
我想,对于间接照明,他们使用的是环境遮挡之类的东西。我说的对吗?
如果这是正确的,那么栅格化和路径追踪的唯一区别将是可见表面测定和间接照明的程序。在这两种技术中,直接照明的计算方法都是相同的?
如果你能提供一个简要的概述,目前的先进技术,在这些引擎中使用的事情,如反射/阴影等,将不胜感激。
发布于 2019-01-25 20:01:20
我猜基于栅格化的管道使用同样的程序来遮阳,即从像素上射出一条射线,然后从那个像素上投射到光源上的三角形?
很近,但不太好。没有射线的实际追踪,但基本的线性代数是相同的。听起来你已经了解了栅格化的第一部分,直到得到一些需要阴影的碎片。每个片段都知道它来自三角形的属性(世界位置,正常等等)。在传统的前向阴影中,碎片着色器每光运行一次,它也知道光的属性,包括从阴影点到光线的世界空间方向:跟踪阴影射线的方向。
虽然没有影子射线被追踪,实际的照明计算是完全一样的:你使用视图和光的方向和表面正常在任何你想要的BRDF。您只需对每个光线重复这个过程,并将结果加在一起即可。在最后,你有相同的结果,从一个非常简单的射线追踪器,没有任何阴影,反射,折射,或间接照明。
如何添加这些缺失的功能?嗯,每种方法都有几种可能的技术,但我将简要地介绍一下最简单的技术。获取阴影的一个简单方法是使用阴影映射。在渲染你的主场景之前,你要把渲染放到屏幕外的缓冲区中,但要用光线作为相机。(投影和形状取决于光,例如定向/圆柱形光的正交投影。)诀窍是,你不能渲染所有的颜色:你只绘制到深度缓冲区。你得到的是一张从光到每个方向最近的物体的距离的图片。稍后,当你在片段着色器中对光线的贡献进行阴影处理时,你会计算出从光线到阴影点的距离,并将它与深度缓冲区中的值进行比较。这告诉你,阴影点是否最接近光线的光线,而不需要进行交叉测试。
平面反射和折射也很简单:只是渲染场景,但是随着相机的转换,产生反射或折射图像。例如,对于湖面或地板上的平面反射,你可以反射摄像机在该平面上的位置,从而把整个场景颠倒过来。当你画出它周围的真实场景时,任何透明度都会显示出这种反射。
https://computergraphics.stackexchange.com/questions/8515
复制相似问题