内容目录
1. Z_buffering 深度测试
2. 光照模型
3. 着色频率
4. 使用纹理贴图
一. Z_buffering
每个图形会对应一个深度值,而每个像素点只会存储深度值最小的图形的信息,从而保证离摄像机更近的点不会被远的的物体遮挡住。
下面是深度测试处理的一个例子。
地面的描画在箱子之后,第二张图片因为没有做深度测试的处理,导致原本应该在箱子之后的地面被画在了前面。
二. 光照模型
Blinn-Phong 模型
最简单的一种光照着色模型。
模型输入
- 光线入射方向的反方向 l
- 着色点的表面法相量 n
- 输入观察者眼中的观察方向 v
- 光的颜色,高光的衰减系数
效果由三部分叠加构成:
-
高光(Specular)
-
漫反射光(Diffuse)
-
环境光(Ambient)
三. 着色频率
Flat shading
直接对每一个面片赋予同一种颜色。
Gouraud shading
先对每一个顶点赋予颜色值,而后通过插值的方法,决定每个三角形面片的颜色。
假设构成三角形三个顶点被赋予的颜色值分别是红绿蓝,则该三角形的插值效果大致如下。
类似的,三角形中任意一点的表面法向量属性也可以通过这种方式插值而得。
Phong shading
沿每个像素点进行着色。
三角形面片上的每个点,通过插值的方法获取到每个点对应的法向量。
而后通过着色模型计算每个像素点的颜色。
这里有个问题,顶点是一个点,顶点对应的表面法向量如何获得?
课程中提到的方法是将与该顶点相邻的所有面的法向量取平均值。
四. 纹理贴图
纹理贴图的应用可能会遇到两方面的问题
1. 当纹理贴图的尺寸远小于应用场景的分辨率。
如要将80 * 80 的图片,贴到分辨率为 800 * 800 的屏幕上,则可能出现多个屏幕上多个像素点会在贴图的同一个像素点上取值(Nearest方法),最终呈现的效果会由较明显的锯齿。
Bilinear插值
屏幕上的像素点映射到纹理图片上的时候,不直接选取贴图中整数坐标位置上最近的像素点的值,而是取了临近的4个像素做插值。
mix(
mix(u01, u11, x - u01.x),
mix(u00, u10, x - u00.x),
y - u00.y
)
Bicubic插值
理解起来是Bilinear插值的推广,
选取的是临近16个像素做插值。
2.当纹理贴图的尺寸大于屏幕大小的时候也可能出现问题。
屏幕上的一个像素点可能会覆盖纹理贴图上多个像素点。
例如下面这个三维场景中,区域A离我们较近,屏幕上一个像素点区域在纹理贴图上对应的区域较小;而区域B,一个像素在纹理贴图上对应的区域就比较大
然而选取的时候,如果只选取其中一个像素点来代表其他像素点,返回的效果也会出现偏差(采样的频率低于信号实际的频率)。
可能出现摩尔纹,锯齿等问题。
应对的方法
由原始的贴图生成多级Mipmap贴图,不同的像素点到适合层级的贴图做映射。
多使用1/3的内存空间。
那么如何确定一个像素点应该到那个层级的Mipmap贴图上找对应。
将一个像素点以及它x方向,y方向的相邻的点映射到纹理贴图上,求出该像素点在贴图上和它相邻像素点的距离,继而用公式可求出大致应该在那个层级的Mipmap上找对应。
但又出现一个问题
算出的D不是整数,如果直接采用向下取整的方法,可能出现这样一种情况,相邻两个像素点,一个在L0层找对应的值,一个在L1层找对应值,如此一来便可能出现较为明显的边界。
解决方法:
在相邻层级Mipmap之间再做一次插值。
应用Mipmap的方法,在一些较远区域,x方向出现模糊的现象。
原因:理解起来是因为生成高一级的mipmap,x,y方向同时都缩小了,但是有些场景中需要的贴图,x, y方向的缩小比例不是同步的
引入Anisotropic Filtering 的方法。
也是生成多级贴图,多考虑了x,y方向缩放不同步的因素。
多使用3倍的内存空间。
更进一步还有EWA Filtering方法。