实时渲染学习(三)图形渲染与视觉外观

参考博文:【《Real-Time Rendering 3rd》 提炼总结】(四) 第五章 · 图形渲染与视觉外观 The Visual Appearance

一、光照与材质

光源主要分为:平行光源、点光源和聚光灯。
材质附加到场景中的模型上可以描绘对象外观,每个材质都和一系列shader、纹理以及其他属性联系在一起,用来模拟光与材质的相互作用。

1.1 光的散射与吸收

一般而言,所有光物质相互作用都是散射和吸收的结果。

  • 散射不会改变光亮,只是改变光的方向,散射可进一步细分为反射和折射。(反射光由环境光、漫反射光和镜面反射光组成。)
  • 吸收发生在物质内部,吸收会减少光量,但不会影响其方向。

1.2 表面粗糙度

镜面反射光的方向分布取决于表面粗糙度。反射光线对于更平滑的表面更加紧密,并且对于较粗糙的表面更加分散。

二、着色

着色(Shade)是使用方程式根据材质属性和光源,计算沿着视线v的出射光亮度Lo的过程。

2.1 着色与着色方程

本节参考《计算机图形学》陆枫 电子工业出版社

2.1.1 着色方程的环境分量

环境光指物体接收到周围物体散射出来的光。
I e = I a K a I_e=I_aK_a Ie=IaKa
其中, I a I_a Ia是环境光反射强度, K a K_a Ka是物体表面对环境光的反射系数。

2.1.2 着色方程的漫反射分量

当光线照射到一个粗糙的、无光泽的表面时,光线沿各个方向都作相同的反射,称为漫反射。也就是说,漫反射光的光强只与入射角有关,即与视点位置无关。
根据Lambert余弦定理可得出某点处的漫反射光强为:
I d = I p K d c o s θ I_d = I_p K_d cos\theta Id=IpKdcosθ
其中, I p I_p Ip为入射光的强度, k d k_d kd为漫反射系数( k d = c d / π k_d=c_d/\pi kd=cd/π), θ \theta θ为光线的入射角。

2.1.3 着色方程的镜面反射分量

理想的高光泽度反射面会发生镜面反射。实际上,非理想光滑表面,在点光源的照射下,也会产生特别亮的区域,称为高光电或镜面光斑。此时,镜面反射光的强度会随入 α \alpha α的增加而急剧减小。这种情况的镜面反射由Phong光照模型给出:
I s = I p K s c o s n θ I_s=I_pK_scos^n\theta Is=IpKscosnθ
其中, I s I_s Is为镜面反射光在观察方向上的光强, I p I_p Ip为点光源的强度, K s K_s Ks为镜面反射系数, α \alpha α为视点方向与镜面反射方向之间的夹角, n n n是与物体表面光滑度有关的常数。

因此,从视点观察到物体上任一点 P P P处的光强 I I I应为环境光 I e I_e Ie、漫反射光 I d I_d Id以及镜面反射光 I s I_s Is的总和:
I = I e + I d + I s I=I_e+I_d+I_s I=Ie+Id+Is

2.2 三种着色处理方法

常见的三种着色处理方法:

  • 平滑着色(Flat shading):逐顶点着色计算,一个三角形面用一个颜色。片元着色器中加入flat关键字表示不对片元插值。
  • 高洛德着色(Gouraud shading):逐顶点着色计算,逐顶点求值后再进行线性插值,无法处理镜面高光,易产生Match带状图案。
  • 冯氏着色(Phong shading):逐片元着色计算,使用插值后的法线数据计算各片元处的颜色值。

注意Phong Shading和Phong Lighting Model的区别,前者是考虑如何在三个顶点中填充颜色,而后者表示的是物体被光照产生的效果。
注意冯氏着色是三者中最接近真实的着色效果,开销也是最大的。高洛德着色是每个顶点(vertex)计算一次光照,冯氏着色是每个片元(fragment)或者说每像素计算一次光照,点的法向量是通过顶点的法向量插值得到的。所以说不会出现高洛德着色也许会遇到的失真问题。

三、抗锯齿

抗锯齿(Anti-Aliasing,AA),也译为边缘柔化、消除混叠、抗图像折叠有损,反走样等。它是一种消除显示器输出的画面中图物边缘出现凹凸锯齿的技术,那些凹凸的锯齿通常因为高分辨率的信号以低分辨率表示或无法准确运算出3D图形坐标定位时所导致的图形混叠(aliasing)而产生的,抗锯齿技术能有效地解决这些问题。

3.1 超级采样抗锯齿(SSAA)

超级采样抗锯齿(Super-Sampling Anti-Aliasing,SSAA)比较消耗资源,但简单直接。
主要步骤:

  1. 把图像映射到缓存并放大,再用超级采样对放大后的图像像素采样,生成的最终像素。此时每个像素拥有邻近像素的特征,图形的边缘色彩过渡趋于平滑。
  2. 将图像还原回原来大小,并保存到帧缓存(显存),最后输出到显示器,显示出一帧画面。

相当于将一幅模糊的大图,细化后再缩小成清晰的小图。 超级采样抗锯齿中使用的采样法一般有两种:

  • OGSS,顺序栅格超级采样(Ordered Grid Super-Sampling,简称OGSS),采样时选取2个邻近像素。
  • RGSS,旋转栅格超级采样(Rotated Grid Super-Sampling,简称RGSS),采样时选取4个邻近像素。

3.2 多重采样抗锯齿(MSAA)

多重采样抗锯齿(Multi Sampling Anti-Aliasing,MSAA),是一种特殊的SSAA。MSAA只对Z缓存(Z-Buffer)和模板缓存(Stencil Buffer)中的数据进行超级采样抗锯齿的处理。可以简单理解为只对多边形的边缘进行抗锯齿处理。MSAA对资源的消耗需求大大减弱,画质上可能稍有不如SSAA。

3.3 覆盖采样抗锯齿(CSAA)

覆盖采样抗锯齿(Coverage Sampling Anti-Aliasing,CSAA)CSAA覆盖边缘多边形里需要采样的子像素坐标,将原像素坐标强制安置在硬件和驱动程序预先算好的坐标中。这就好比采样标准统一的MSAA,能够最高效率的执行边缘取样,效能提升非常的显著。

3.4 高分辨率抗锯齿(HRAA)

高分辨率抗锯齿方法(High Resolution Anti-Aliasing,HRAA),采样模式是五点梅花状,其中四个样本在像素单元的角上,最后一个在中心。

3.5 可编程过滤抗锯齿(CFAA)

可编程过滤抗锯齿(Custom Filter Anti-Aliasing,CFAA),CFAA是扩大采样面积的MSAA,MSAA严格选取物体边缘像素进行缩放,而CFAA则可以选择对影响锯齿效果较大的像素进行缩放,以较少的性能牺牲换取平滑效果。

3.6 形态抗锯齿(MLAA)

形态抗锯齿(Morphological Anti-Aliasing,MLAA),是Intel提出的纯CPU AA。 MLAA将跨越边缘像素的前景和背景色进行混合,用第2种颜色来填充该像素,从而更有效地改进图像边缘的变现效果。

3.7 快速近似抗锯齿(FXAA)

快速近似抗锯齿(Fast Approximate Anti-Aliasing,FXAA) ,是MSAA效果的一种高性能近似。运行于渲染管线的后期处理阶段,只是单纯的后期处理着色器,不依赖于任何GPU计算API。FXAA技术对显卡没有特殊要求,完全兼容NVIDIA、AMD的不同显卡。

3.8 时间性抗锯齿(TXAA)

时间性抗锯齿(Temporal Anti-Aliasing,TXAA),将 MSAA、时间滤波以及后期处理相结合,用于呈现更高的视觉保真度。

3.9 多帧采样抗锯齿(MFAA)

多帧采样抗锯齿(Multi-Frame Sampled Anti-Aliasing,MFAA),MFAA与MSAA最大的差别就在于在同样开启4倍效果的时候MSAA是真正的针对每个边缘像素周围的4个像素进行采样,MFAA则是仅仅只是采用交错的方式采样边缘某个像素周围的两个像素。

四、透明渲染与透明排序

4.1 透明渲染

透明渲染主要有以下两种方法:

  • Screen-Door Transparency方法。以棋盘格填充模式绘制透明多边形,即隔一个像素绘制一点,这样会使其后的物体部分可见。由于屏幕上的像素比较紧凑,采用棋盘格绘制方式也不会被察觉。特点:简单,可在任何时间任何顺序绘制透明物体,但透明度效果仅在50%时最好,每个区域中只能绘制一个透明物体。
  • Alpha混合方法,按照Alpha混合向量混合源像素和目标像素。

4.2 透明排序

要将透明对象正确地渲染到场景中,通常需要对物体进行排序。主要方法有深度缓存、油画家算法、加权平均值算法和深度剥离。

4.2.1 深度缓存

Z-buffer是在为物件进行着色时,执行“隐藏面消除”工作的一项技术,所以隐藏物件背后的部分就不会被显示出来。Z-buffer的限制是每像素只存储一个对象。如果一些透明对象与同一个像素重叠,那么单独的Z-buffer就不能存储和解析出所有可见对象的效果。

4.2.2 画家算法

画家算法(Painter’s Algorithm)也称优先填充算法,油画家算法。效率虽然较低,但可以有效处理透明排序的问题。其基本思想是按照画家在绘制一幅画作时,首先绘制距离较远的场景,然后用绘制距离较近的场景覆盖较远的部分。画家算法首先将场景中的多边形根据深度进行排序,然后按照顺序进行描绘。

4.2.3 加权平均值算法(Weighted Average)

使用简单的透明混合公式来实现无序透明渲染的算法,它通过扩展透明混合公式,来实现无序透明物件的渲染,从而得到一定程度上逼真的结果。

4.2.4 深度剥离算法(Depth Peeling)

深度剥离是一种对深度值进行排序的技术。标准的深度检测使场景中的Z值最小的点输出到屏幕上,就是离我们最近的顶点。但还有离我们第二近的顶点,第三近的顶点存在。要想显示它们,可以用多遍渲染的方法。在第二遍渲染时,把现在每个顶点的深度值和刚才的那个深度值进行比较,凡是小于等于第一遍得到的z值,把它们剥离,后面的过程依次类推即可。

五、伽玛校正

伽马校正(Gamma correction) 又叫伽马非线性化(gamma nonlinearity),伽马编码(gamma encoding)
或直接叫伽马(gamma),是用来对光线的亮度(luminance)或是三色刺激值(tristimulus values)进行非线性的运算或反运算的一种操作。为图像进行伽马编码的目的是用来对人类视觉的特性进行补偿,从而根据人类对光线或者黑白的感知,最大化地利用表示黑白的数据位或带宽。

后记

本章内容比较多,例如光照方程、透明排序等最好自己编码实现才能加深印象,我有时间会自己尝试实现并把代码贴上来的,这里立个Flag~

你可能感兴趣的:(图形学)