Games101-4-着色
Games101-4-着色
着色模型(Blinn-Phong Reflectance Model)
根据感性观察有:
- Specular highlights (镜面反射高光)
- Diffuse reflection (漫反射)
- 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