Games101-4-着色

Games101-4-着色

着色模型(Blinn-Phong Reflectance Model)

根据感性观察有:

  1. Specular highlights (镜面反射高光)
  2. Diffuse reflection (漫反射)
  3. Ambient lighting (环境光)

漫反射

认为漫反射是均匀的向各个方向反射的

由上图以及地球的季节变化可知,光线直射方向和平面的夹角决定接受光的能量的多少。

光的能量也与距离光源的距离有关,与距光源的距离的平方成反比。

法线n·入射光l = cos夹角

kd 表示该shading point的颜色(之后texture贴图就是改变kd的值)

漫反射的着色与观测角度无关 也就是说无论在哪个方向观测,同一个着色点的颜色总是相同。例如:月球表面

镜面反射

镜面反射与观测角度有关 纯镜面即完全按照镜面反射规律进行反射,若是光滑一些的物体如金属,是在镜面反射出射光线的一个角度范围内可见。

h是半程向量,这里的bisector是OpenGL中的函数(平行四边形法则)。指数p就是为了控制出射光线的可见角度范围,一般p为200左右(出射光线的左右5-6度)

环境光

在Blinn-Phong这个经验模型中,环境光被认为与任何东西都无关,即是一个常量。

将三种光照相加即可得到最终的着色结果。

着色频率(Shading Frequencies)

flat shading

对每个三角形进行着色

每一个三角形有一条法线。

Gouraud shading

对每个顶点进行着色

对三角形内部的点,根据三个顶点的颜色进行颜色插值,每一个顶点有一条法线。

Phong shading

对每个像素进行着色

对三角形内部的点,根据三个顶点的法线进行法线插值,计算出每一个像素的法线。

法线定义方法

利用重心坐标插值

重心坐标(Barycentric Coordinates)

系数均为1/3时,就是三角形的重心。

插值可以对任何属性进行插值,例如颜色,纹理,法线,深度等等。

重心坐标在投影变换后无法保证依然正确,因此要在投影变换之前进行插值,也就是要用空间中的坐标进行计算。

图形(实时渲染)管线

Texture Mapping & 应用纹理

Texture Magnification (纹理过大过小问题)

纹理分辨率过小

Bilinear Interpolation (双线性插值)

纹理分辨率过大

问题在于一个像素里包含了很大一片纹理,而仅用一个纹理上的采样点代表这一片纹理。超采样(Supersampling)当让可以解决这个问题,但是消耗太大。为了解决这种问题就引入了Mipmap。

Mipmap

mipmap的思路是避免采样,直接得到一片区域的平均值,提前生成不同分辨率的图像,之后用这些生成的低分辨率图像代表这一片区域的平均,mipmap多消耗的存储空间是原来的三分之一。

之后进行trilinear插值,让mipmap的level可以平滑过渡。得到下图的可视化结果。

Mipmap的局限

由于Mipmap是用一个正方形区域近似真正被像素覆盖的区域,对上图这种长条形的区域就无法取得比较好的近似效果,就会产生过度模糊。

为了避免过度模糊,引入了各向异性过滤。

环境贴图

凹凸/法线贴图(Bump/normal mapping)

先求出p点的切线向量,之后旋转九十度就可得到新的法线向量。

3d坐标原理类似。

参考

课程视频
课程网址
GAMES101_Lecture_07.pdf
GAMES101_Lecture_08.pdf
GAMES101_Lecture_09.pdf
GAMES101_Lecture_10.pdf


Games101-4-着色
https://kenny-hoho.github.io/2022/08/25/Games101-4-着色/
作者
Kenny-hoho
发布于
2022年8月25日
许可协议