HPP_Graphics_1.3 纹理的秘密
a). 什么是纹理
一种可供着色器读写的结构化存储形式(采样器变量的形式,sampler)
b). 纹理管线
模型空间位置→投影函数(不同与摄像机投影矩阵,是展UV其中一步)→纹理映射→纹理坐标→通讯函数→新纹理坐标→纹理采样(避免依赖纹理读取,如果片元着色器中不是使用顶点着色器中传递的数值,而是经过计算,那么就会产生依赖纹理读取,影响性能。因此,uv的偏移通常在顶点着色器中完成)→纹理值
c). Wrap Mode
- 简介:
- 决定uv[0, 1]以外的表现
- OpenGL —— 包装模式(Wrapping Mode)
- DirectX —— 纹理寻址模式(Texture Addressing Mode)
- 类型:
- Repeat
- Mirror
- Clamp
- Border
d). Filter Mode
- 在不同形状、大小、缩放比时,纹理过滤模式,可由专用硬件实现,也可由软件中实现,也可软硬件搭配完成
d.1) 放大(Magnification)
- 最近邻(性能消耗小,放大时每个像素读取最邻近的纹素,可能出现马赛克像素风格)
- 双线性插值——对于每一个像素点都寻找邻近的四个像素点(实际),在二维空间进行的线性插值得到的最终混合值
- 双线型内插值算法就是一种比较好的图像缩放算法,它充分的利用了源图中虚拟点四周的四个真实存在的像素值来共同决定目标图中的一个像素值,因此缩放效果比简单的最邻近插值要好很多
- $P(u,v)$是屏幕空间的坐标,屏幕空间左下角为$(0, 0)$,而左下角第一个像素的像素中心坐标为$(0.5, 0.5)$
- The Center of the Pixel is (0.5,0.5)
- 立方卷积插值
- 兰索斯插值(不常见,性能开销大)
- Quilez 的光滑曲线插值 —— 在立方卷积插值与双线性插值的一个折中效果,画面表现效果要比双线性插值好,比立方卷积插值差
- 在纹理坐标带入到双线性插值过程之前再额外进行了一步处理
- 效果对比:
d.2) 缩小
可能出现的问题:出现颜色丢失与闪烁(奈奎斯特定律)
解决方式:
- 最邻近、双线性插值(有限地增加采样频率)
- Mipmap(减小纹理频率)
e). Mipmap
- 特点:每一级纹理的大小都是上一级的1/4,因此整套纹理只比原来的单张多占1/3内存(等比数列)
e.1) ddx、ddy(片元着色器指令,注意是在片元着色器中的!)
GPU并不是一个个Pixel执行的,而是分成2*2的组,分块并行执行
ddx、ddy是x、y方向上的偏导数,通过ddx、ddy可对各种数据(uv、normal……)求偏导,可用于
- mipmap:通过ddx、ddy求uv的偏导,得到的最长边用于确定mipmap的level
- 可求法线
三线性插值(待看)
- 特点:mipmap内存大1/3,但带宽压力变小(有时候只用传输小的贴图就行)
- 缺点:假设各向同性,但当缩放不一致(倾斜角过大)时可能模糊
- 解决方式:各向异性过滤(Anisotropic Filtering)
f). 各向异性过滤(Anisotropic Filtering)
作用:减少模糊,保护在极端观察角度下的细节
当纹理在x坐标方向和在y坐标方向缩放的比例不一样,纹理的缩放是各异向的,Pmax/Pmin代表了各异向的程度。举个例子来说,64 x 64的纹理贴到一个开始平行于xy平面的正方形上,但是正方形绕y轴旋转60度,最后投影到屏幕上占了16 x 32的象素矩阵。纹理在x坐标方向上缩放的比例因子为64/16等于4,在y坐标方向缩放的比例因子为64/32等于2,Pmax等于4,Pmin等于2。缩放的各异向程度为2。(https://blog.csdn.net/u013467442/article/details/44466069)
- 各向异性过滤是一系列过滤方法,是搭配其他过滤方式一起使用的,常见的方法有Ripmap、积分图(SAT, Summed-Area Table)、重用mipmap等
f.1) Ripmap
- 做各种比例的预处理,部分解决问题
- 内存会大三倍
f.2) 积分图(SAT, Summed-Area Table)
- 每一位以更多位数储存,储存与左上纹素的总和(具体等看GAMES202补充)
- 右边表格的数据怎么来的呢?就跟图上上面的公式是一样的 比如2行2列的8 就是 2 + 3 + 3 + 0 再比如一行四列的8 就是 2 + 3 + 2 + 1以此类推
f.3) 重用Mipmap
- 不是用ripmap,而是重用mipmap,屏幕像素反向投影到纹理空间,通过纹理空间中长方形的最短边确定level。缩放的各异向程度后(看前面例子),创建各向异性线,穿过方块中心,根据程度,确定采样次数,并沿线段进行采样、混合
- 目前GPU一般支持16x的各向异性过滤
- 一般基于三线性过滤
g). CPU渲染优化常见方式
- 减少DrawCall
- 纹理图集、纹理数组
h). GPU渲染优化常见方式
- 降低显存带宽压力
- 纹理压缩
i). Other texture
i.1) Cubemap
- 纹理左下角(0, 0)
i.2) Bump Mapping
i.3) Displacement Mapping
- 搭配曲面细分着色器
【Work】
Filter Mode:
纹理优化方式及其原理: