图形 1.3 纹理的秘密

图形 1.3 纹理的秘密

纹理是什么?

宏观角度:一张图片
微观角度:一种可供着色器读写的结构化存储方式,可以存储法线,高度等信息

纹理的作用

1.牺牲几何细节,降低建模工作量
2.降低存储空间
3.提高读取速度

纹理管线

模型空间位置->投影函数->纹理映射->纹理坐标->通讯函数->新纹理坐标->纹理采样->纹理值在这里插入图片描述
注意:这里投影函数的投影与摄像机的投影不一样,用于展UV阶段使用
依赖纹理读取:如果片元着色器不是直接用顶点着色器的数据而是传过来再进行计算会触发依赖纹理读取造成性能损失,因此UV偏移经常放在顶点着色器中完成
下图展示了空间坐标到uv坐标到纹理坐标(uv坐标乘上纹理坐标,图中为256*256)到采样得到最终颜色的过程
在这里插入图片描述

纹理采样设置之Wrap Mode

在这里插入图片描述
Repeat:重复
Mirror:镜像
Clamp:采用边缘处颜色值
Border:采用一个定值填充

纹理采样设置之Fliter Mode

Fliter Mode(过滤器设置)决定当纹理由于变换而产生拉伸的时候采用哪一种滤波来改善表现

放大

在这里插入图片描述
最近邻:每一个像素都会读取最邻近的一个纹素(纹理图像中的像素),性能消耗低但是会有像素化的表现
双线性插值:每一个像素找到临近的四个纹素点在二维空间进行线性插值,表现比最近邻好一点
在这里插入图片描述
立方卷积插值:除了考虑周围四个像素点的影响还考虑到他们变化率的影响,性能消耗更大
quilez插值:相当于在双线性插值之前对纹理坐标进行一次处理,效果和性能介于双线性插值和立方卷积插值之间
在这里插入图片描述
在这里插入图片描述
四种插值方式的比较
在这里插入图片描述

缩小

缩小的最近邻和双线性滤波与放大的算法类似,但会造成颜色丢失与闪烁问题
在这里插入图片描述

Mipmap

通过预处理生成不同大小纹理图片的方式来快速计算一组纹理对一个像素的近似值
在这里插入图片描述
使用mipmap时如何选择正确的层级?
使用像素单元格形成的四边形的最长边来近似像素覆盖的范围来计算(具体计算见下图代码)
在这里插入图片描述
优点:消耗的带宽少
缺点:每一张纹理都需要多出1/3的空间存储不同大小的图片;
Mipmap切换level时过渡不平滑(三线性插值解决了过渡不平滑的问题,对最近的两个mipmap分别进行双线性过滤,对结果再进行线性插值);

过度模糊,如果一个像素在u方向上覆盖了大量的纹素而在v方向上只覆盖了少量的纹素(例如矩形),那么会导致最后采样的结果不美观(比如游戏中一张垂直的矩形图片旋转到水平快变成直线的时候会失真)于是有了各向异性过滤

各向异性过滤

各向异性过滤是一种思想,有多种实现

RipMap

RipMap生成了UV不同的各种分辨率的纹理(如果只生成对角线的图相当于mipmap,横向看X缩小了一半,纵向看Y缩小了一半)(下图是wiki上的机翻)
在这里插入图片描述

积分图Summed-Area Table

积分表记录了从左上角到该点形成的矩形内所有元素之和
在这里插入图片描述
为什么在Unity/UE4里各向异性过滤开启后纹理内存不是三倍而是三分之一?
因为现在的硬件重用了现在的mipmap方案,将屏幕像素反向投影到纹理空间,通过要覆盖像素的最短边来确定level,再在最长边创建一条过中心的线按照过滤等级高低沿着这条线段多次采样并合成。各向异性越高沿轴采样次数越多。这样做也就不会像Ripmap产生很多纹理图片,只需要多三分之一即可(Mipmap),但是采样次数变高了,计算消耗高
在这里插入图片描述

纹理贴图优化

1.纹理图集/数组(CPU端)
纹理数组/图集相当于把许多小纹理合并成一个大纹理,以减少drawcall(CPU准备数据并向CPU提交的一次过程称为drawcall)
在这里插入图片描述

2.纹理压缩(GPU端)
在这里插入图片描述

立方体贴图

例如天空盒可以使用一张立方体贴图进行映射
在这里插入图片描述

凹凸贴图与位移贴图

采用一张贴图来模拟物体表面凹凸不平的效果,凹凸贴图只是改变了颜色模拟起伏,而凹凸贴图改变了顶点的位置
在这里插入图片描述

作业

1.Fliter Mode有哪几种?
放大:最近邻插值,双线性插值,立方卷积插值,quilez插值
缩小:最近邻插值,双线性插值,mipmap,各项异性过滤(如ripmap,EWA过滤,Summed-Area Table)
2.纹理贴图的优化方式及原理?
CPU:
纹理图集/数组,把许多小纹理合并成一个大纹理,减少drawcall
unity的批处理,把材质相同的物体合并使用一次drawcall完成
GPU:
纹理压缩,降低纹理所占空间大小,优化显存带宽
Mipmap,消耗内存优化显存带宽,原理见上文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值