个人博客完整原文:https://alvincr.com/2021/02/ue4-1-rendering/
一:基础知识
参考:WIKI
1 定义
在计算机图形学中,渲染是指用软件从模型中生成图像的过程。该模型是由语言或数据结构严格定义的3D对象或虚拟场景的描述,包括几何、视点、纹理、光照和阴影信息。图像是数字图像或位图图像。渲染用于描述:在视频编辑软件中计算效果,生成最终视频的输出过程。
2 渲染方法
跟踪场景中的每束光线是不现实的,需要花费大量的时间。如果没有使用好的约束条件进行采样,即使部分光线跟踪生成图像也需要很长的时间。因此,可以大致分为四类的更有效的光传输模型技术应运而生:
- 栅格化,包括扫描线绘制,它考虑到场景中的物体并将其投影到图像中,但缺乏一些先进的视觉效果;
- 光线投影,它从不同的角度观察场景,只根据几何和反射强度的基本光学原理计算观测到的图像,或者可以使用MonteCarlo方法来降低人工噪声。
- 辐射着色,它用有限元分析来模拟光在表面的散射;
- 光线追踪,类似于射线投影,但采用了更先进的光学模拟方法,而蒙特卡罗方法通常用来获得更多的真实结果,但这样做的成本往往大大降低了速度。
大多数先进的软件使用多种技术,在合理的开销范围内取得足够好的效果。
3 蒙特卡罗方法
3.1 方法
全称Monte Carlo method,也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。
这个方法我们并不陌生,在AlvinCR高中和大学阶段就经常接触蒙特卡罗方法,虽然当时不知道叫这个名字,例如对π进行求值的时候,如果采用统计学上的方法进行处理,可以通过丢石子看有多少个石子落在园内,有多少个落在圆外的外接正方形中,从而统计出π。WIKI上的例子:使用蒙特卡罗方法估算π值. 放置30000个随机点后,π的估算值与真实值相差0.07%。
即蒙特卡罗方法的精髓在于用统计方法求出模型的数字特征,从而解决实际问题。
3.2 问题
在渲染的过程中使用蒙特卡洛光线追踪,通过将半球积分方程进行近似简化来实现加速的效果,相当于通过采样对光线进行模拟。
但是由于计算机产生的随机数是受到存储格式的限制的,是离散的,并不能产生连续的任意实数;因此将平面分割成一个个网格的做法,会使分割出的空间不连续,由此计算出来的面积实际面积有或多或少的差距。
4 阴影算法
原文:https://www.btbat.com/2123.html
4.1 传统的阴影算法:
游戏中传统的光照算法,是利用公式法来计算特定类型光源的直接光照在物体表面所产生的反射和漫反射颜色,然后再使用阴影算法做阴影补偿。标准的阴影算法不能计算面光源,改进以后的阴影算法通过对面光源采样,可以模拟出软阴影的效果。但是这些方法计算的光照都是来自直接光源的,忽略了光的传播过程,也就无法计算出由光的传播所产生的效果。通过特定的修正,我们也可以计算特定的反射折射或漫反射过程,但是无法给出一种通用并且物理正确的方法。目前游戏中大多是采用改进的阴影算法来进行渲染,它的优点是效率比较高,结合预计算的话,还是可以产生比较生动可信的效果。
4.2 传统的逆向光线追踪:
正如前面描述的那样,要想计算光能在场景中产生的颜色,最自然的考虑就是,从光源出发,正向跟踪每一根光线在场景中的传递过程,然后收集信息。然而这个想法在被提出的来的那个时代的计算机硬件上是不可能实现的,当时人们认为,正向光线追踪计算了大量对当前屏幕颜色不产生贡献的信息,而且它把看不见的物体也计算在内,极大的浪费了效率。于是人们想出的另一个方法是:只计算有用的,从人眼出发,逆向跟踪光线。
逆向光线追踪从视点出发,向投影屏幕发出光线,然后追踪这个光线的传递过程。如果这个光线经过若干次反射折射后打到了光源上,则认为该光线是有用的,递归的计算颜色,否则就抛弃它。很显然,这个过程是真实光线投射的逆过程,它同样会产生浪费(那些被抛弃的逆向光线),而且只适用于静态渲染。
4.3 AlvinCR总结:
传统的阴影算法计算出的光照都是直接来源于光源,忽视了光在传播过程中所发生的变化,在日常生活中光遇到物体会发生漫反射、折射、全反射等各种现象,并不是一成不变的,可是当前并没有计算光线变化的通用方法,就只能采用改进的阴影算法进行模拟,虽然效果相对较差,但是效率很高。
对一个事物如果反过来看待,也许会有更好的方法,逆光线追踪就是这样产生的,既然难以计算所有光传播中产生的各种效果,那我们就将好钢用在刀刃上,只计算影响最终效果最强的因子,从入眼光线着手,反推哪些光线比较重要,通过对重要的光线进行模拟,就能使得计算量大减,同时实际效果并不会减少很多。