纹理的概念
宏观上纹理是指的一张贴图
细分上纹理指的是一种多维的存储容器
纹理为何出现
纹理的出现可以降低工作量
降低存储空间的消耗
提高运行效率
纹理管线
![[Pasted image 20211219003227.png]]
纹理管线先将模型由物体空间转换成纹理空间 就是常见的展开uv 但是也有一些特例使用纹理的方式不需要展开uv 再对纹理空间进行一个变换 必须在vertexshader中进行因为如果在fragshader中进行的话会造成性能的浪费图像纹理和程序纹理得到都是RGBA四个值如果采用合成的方式则RGBA中存储的不仅仅是颜色
纹理管线的例子
![[Pasted image 20211219010723.png]]
Wrap Mode
包装模式
- 重复模式 Repeat
- 镜面模式 Mirror
- clamp模式 对于外层进行拉伸缩放
- border模式 对于外层切换为纯色
Filter mode
解决部分没有采样到的问题 拉伸 旋转等
- 选择最近的一个元素
- 选择附近四个元素线性插值
- 选择附近16个元素卷积计算
![[Pasted image 20211219085654.png]]
缩小时如何处理多个像素合为一个
提高采样频率
- 最临近采样
- 线性插值
降低纹理频率
Mipmap
- Mipmap为缩小为原来四分之一的原图 并最终缩小到1个pixel
- 采样的时候理论是对片元进行偏微分处理得到最长的x或y边来平方 再通过三线性插值得到最近似的两个取平均值
- 但是会有overflour问题 各向异性模糊
Ripmap
CPU和GPU渲染的优化
CPU和GPU之间有一个命令缓存区 使得CPU传出与GPU读入相互独立
CPU优化
CPU优化可以通过将更多的贴图合成一张 即使用纹理图集而不使用纹理数组的方法来实现调用更少次数的DrawCall指令
GPU的优化
通过纹理压缩减少缓存区内纹理的大小实现
立方体贴图CubeMap
CubeMap为一个六面体贴图 具体的采样方法为使用一个三维的向量 首先找出绝对值最大的那个方向的坐标作为面 在将其他两个方向的最大值作为1 取较小的值除以这个较大的值 取到相应的uv
BumpMap 凹凸贴图
将法线进行凹凸处理来实现一个虚假的凹凸表面,实际上物体的样子并未改变,并且阴影不会改变
DisplacementMap
真的改变表面凹凸情况 阴影也会改变
但是如果遇到纹理的像素多 物体表面的三角形少则采用曲面细分的方法进一步提高精确度