什么是纹理
宏观的角度上来说就是一张2D图片,每个像素上都有 RGB 值
为什么要出现纹理
降低建模工作量,牺牲几何细节
降低存储空间
提高读取速度
纹理采样设置——Wrap Mode
Repeat :重复
Mirror :重复左右镜像,上下反转
Clamp :超出的部分为Texture的边
Border :使用定值进行填充
纹理采样设置——Filter Model
过滤设置,当纹理通过变化产生拉伸的时候,要使用哪种滤波来进行纹理的表现
最近邻 —— 向最近的像素进行纹理取样表现,这个形式带来的问题就是,因为是从邻近像素采集的信息,所以很容易出现块状像素,也就让纹理
变得像素化,处理效果最差,但是因为是从邻近纹理取样的,所以所涉及的计算要少很多,在性能上表现不错
图片比显示区域小,1对多,马赛克
图片比显示区域大:会丢弃掉一部分,变的模糊
双线性插值 —— 对于每一个像素点都寻找邻近的四个像素点,在二维空间进行的线性插值得到的最终混合值
就近四个点采样
立方卷积插值 —— 相比较双线性插值,在这个计算方法中不仅采取周围一圈的像素点,还考虑到了它们变化率的影响,画面表现效果比前两种都
要好,也正是牺牲了性能提高了表现效果
从 128*128就近取4个点的像素,然后从64*64在就近取4个点两部分像素叠加除以2,丢弃的像素更少、更平滑
MipMap
Mipmap:128*128 ==> 64*64 32*32 16*16 8*8 4*4 2*2 1*1
预处理纹理,创建数据结构。实时计算中快速计算一组纹理对一个像素效果的近似值,将 2x2 的4个相邻的纹理平均值作为下一级的新的纹理值,所以新一级的纹理是上一级的1/4大。直到 1x1 ,在存储空间多了1/3大 。
如何选择正确的 level
使用像素 XX (什么格?)格所形成的一个四边形的最长边来近似这个像素覆盖的范围,在 GPU 中并不是一个像素一个像素的去渲染执行,而是分成 2x2 一组并行进行处理,这样做的原因是用来计算 ddx ddy,以及用来计算法线
缺陷:过度模糊
假设这个 Texture 在投射屏幕上是各向同性的,如果一个像素单元格在 U 上覆盖了大量的纹理,但是在 V 上覆盖了少量的纹理,在 MipMap 处理中缩小使用的是上一张纹理相邻四个纹理的平均值,也就是说在 MipMap 情况下,那些被平均过的纹理就会被限制到这些正方形中,于是就产生了各向异性过滤处理部分问题
纹理贴图的优化方式及原理
CPU 渲染优化常见方式 —— 纹理图集/数组
立方体贴图 Cubemap
凹凸贴图 Bump Mapping
位移贴图 Displacement Mappping
作业——Fliter Mode有哪几种
point:就近采样
bilinear:就近四个点采样
trilinear:从 128*128就近取4个点的像素,然后从64*64在就近取4个点两部分像素叠加除以2,丢弃的像素更少、更平滑
作业——纹理贴图的优化方式及原理
CPU:
GPU渲染速度快于CPU提交命令速度
降低DrawCall
纹理图集、纹理数组、约束纹理
GPU:
纹理过大,限于显卡带宽
解决方法是压缩纹理
纹理压缩,减小纹理占用的纹理内存