【TA-霜狼_may-《百人计划》】1.3 纹理的秘密
1.3 纹理三大问
1.3.1 纹理是什么?
任何一张图片都可以是纹理,
从计算机渲染的角度来说,是一种可供着色器读写的结构化存储形式。
纹理可以不仅仅是图片,也可以包含采样纹理时的各种设置。
1.3.2 为什么需要纹理?
通过牺牲几何细节,达到大幅度降低工作量的目的,能够有效节省存储空间并提升读取速度。
1.3.3 纹理管线
纹理管线的全流程:
模型空间位置 =》
投影函数(与之前渲染管线整体流程中几何阶段中的投影完全不同,注意区分)=》
纹理映射=》
纹理坐标=》
通讯函数=》
新纹理坐标=》
纹理采样(避免依赖纹理读取)=》
纹理值
例子
1.3.4 纹理采样设置之Wrap Mode
决定UV值在[0,1]以外的表现
OpenGL ——“包装模式” (Wrapping Model)
DirectX ——“纹理寻址模式”(Texture Addressing Model)
以下为Wrap Mode的四中常见方法,用以解决当uv坐标映射到[0,1]以外时的问题。分为:Repeat,Mirror,Clamp,Border
1.3.5 纹理采样设置之Filter Mode
当纹理由于拉伸而产生变化的时候要采用哪一种滤波模式来调整自身的表现。简单来说:用以对抗由于图形畸变造成的失真(我自己总结的)。
一般情况而言,纹理过滤是在专有硬件上通过一系列的特定技术来完成的,同样可以在软件中完成,也可以进行软硬件的结合。
1.3.5.1 放大:
-
最近邻
- 通过多个像素采样同一个纹素的方法,达到放大的目的,从而产生像素化的现象。
- 开销较小
-
双线性插值
- 例子如下:
(u’,v’)的由来:
- 通过uv坐标获得当前纹素的中心坐标,
- 由此推得能够包裹当前纹素位置的最近的四个像素点,
- 再以该四个点为基础组成坐标,
- 纹素在该坐标系下的位置就是上述的(u’,v’)。
- 底部公式通过四次权重相加的方式达到线性插值的目的,效果是最近邻的四倍。
- 例子如下:
-
立方卷积
- 简单了解,自己去搞搞
- 简单了解,自己去搞搞
-
Qu’iLez光滑线性插值
- 常见的曲线有如下两种:
光滑曲线的插值过程:
- 常见的曲线有如下两种:
四种方法效果对比图:
1.3.5.2 缩小:
- 最邻近
- 双线性插值
- 表现与最近邻类似,2x2的采样方式还是不太能够抵抗上图中举出的闪烁情况。
- Mipmap
- 以原始图片作为金字塔的底部
- 将2x2的4个相邻的纹理的平均值作为下一级的新的纹素值
- 依次重复直到像素大小为1x1
- 整体数据占用量只多了1/3
- 关键问题在于选择正确的level(重要)
- 有一个问题:overblur
- 利用各向异性过滤
- SAT
- (这一部分需要game101的基础,恶补一下gkd)
渲染优化常见方式
- 针对CPU:纹理图集 / 数组
- 促使CPU和GPU并行工作
- DrawCall是其中一种,瓶颈主要在于CPU - GPU的优化主要从带宽入手
- 纹理压缩
常见纹理介绍
- 立方体贴图 CubeMap(常用于环境贴图)
- 凹凸贴图 Bump Mapping
- 位移贴图 Displacement Mapping
总结
Filter Mode有哪几种?
- 放大:
- 最近邻:从单一纹素直接取值
- 双线性插值:取2x2的纹素进行插值
- q曲线插值:效果介于双线性插值和立方卷积插值之间
- 立方卷积插值:取4x4像素,并且考虑变化速率
- 缩小:
- 最近邻
- 双线性插值
- mipmap(重 难 再看games101)
纹理优化方法和原理:
- cpu优化,利用纹理数组合,纹理集合,提升CPU性能,减少DrawCall
- gpu优化,利用纹理压缩,有效利用有限的带宽。