Game101课程笔记_lecture09_着色(插值,高级纹理映射)与阴影
1 重心坐标
1 重心坐标引入原因
作三角形内的插值。
为啥要插值呢?
内容:定义在三角形顶点的法线
2 重心坐标
三角形内的任意点都可以用三角形的三个点的坐标线性表示。
重心坐标是三个数。
点在三角形内,必须满足这三个系数都大于零。
A点自己的重心坐标是什么?
其实这三个数都是可以用三角形的面积比求出来。如下图:
重心坐标的一个特性如下:
任意一个点的重心坐标计算公式如下:
先算出它的重心坐标,然后再插值三角形三个顶点的其他属性。
重心坐标在投影之后坐标会变化,所以插值三维空间的属性,就应该插值三维空间中的重心坐标,然后再对应到二维空间中。
重心坐标和插值的关系是什么呢?
2 Texture queries
1 纹理的放大texture magnification
纹理太小了怎么办?纹理就会被拉大,取到的指会是非整数。
texel纹理元素,纹素
1 Nearest 四舍五入
2 Bilinera interpolation 双线性插值
找邻近的四个点。
线性插值:
双线性插值:水平和竖直方向插值。
水平方向插值:
竖直方向插值:
3 bicubic
取邻近的周围的16个点。
开销降下去,然后得到一样的结果。
2 纹理太大
1 导致的问题
纹理大了,问题更严重。
问题如下:
问题原因:
屏幕上覆盖的纹理大小都是不一样的。
一个像素覆盖的纹理大的时候,用像素中心取采样,是不可以的。
2 解决办法:超采用,but太慢
像素内部包含很大的纹理,
采用一个像素内采样多个点来采样这快很大的纹理,来做反走样。
3 Mipmap
用另一个方法:不采样。
任何一个区域你要得到它的平均值。这个就是mipmap
点查询和范围查询问题;
以前做的是点查询
这个问题是范围查询,查平均值。有不同种类的
如何快速知道它的平均值。
mipmap可以做近似查询,但是有以下的特点;
快,不准,正方形
mipmap:一张图生成多张图。
第一层:分辨率128X28
第二层:64X64
… : …
拿到纹理后,先生成mipmap
在视觉领域内,叫做图像金字塔。
mipmap引入了多大的存储量呢?
和第一幅图小,这个是级数求和的,1+1/4+1/16+。。。。
只是增加了原来存储量的1/3。
另外一种理解方式:
这一块比较难懂。
查询的区域有多大?
任何一个像素都可以映射到纹理上的一个区域。
在第几层取查它呢?在D=log2L;
离的近的在底层查,离的远的在高层查
会有不连续的地方,没有1.5层,如何做呢?
层与层之间的插值,用来解决不连续的问题:如下
三线性插值:做两次查询,做一次插值
mipmap的限制
mipmap在远处就完全模糊了,为啥了?
解决办法:各向异性过滤,如下:
多了不均匀的水平和竖直方向的压缩。
各向异性解决了对于矩形的查询,但是对于斜行的,没法解决。开销增加了3倍
各个方向上表现都不同。mipmap是各向同性。
EWA过滤。
采用了多次查询。
整个光栅化的过程都涉及到了。这是硬件要做的事情。