实时渲染学习(四)纹理贴图及相关技术

参考博文:【《Real-Time Rendering 3rd》 提炼总结】(五) 第六章 · 纹理贴图及相关技术

概念导览:

  • 纹理管线 The Texturing Pipeline
  • 投影函数 The Projector Function
  • 映射函数 The Corresponder Function
  • 体纹理 Volume Texture
  • 立方体贴图 Cube Map
  • 纹理缓存 Texture Caching
  • 纹理压缩 Texture Compression
  • 程序贴图纹理 Procedural Texturing
  • Blinn凹凸贴图 Blinn Bump Mapping
  • 移位贴图 Displacement Mapping
  • 法线贴图 Normal Mapping
  • 视差贴图 Parallax Mapping
  • 浮雕贴图 Relief Mapping

一、纹理管线

图像纹理中的像素通常被称为纹素(Texels)。纹理贴图过程的初始点一般基于模型空间,因为当模型移动时,纹理需要随之移动。纹理管线的具体流程如图:
实时渲染学习(四)纹理贴图及相关技术_第1张图片
纹理管线经过了三次变换过程:

  1. 对模型空间中的位置 ( x , y , x ) (x,y,x) (x,y,x)应用投影函数,将 ( x , y , x ) (x,y,x) (x,y,x)转换为参数空间中的 ( u , v ) (u,v) (u,v)坐标(值域为 [ 0 , 1 ] [0,1] [0,1]);
  2. 根据图像分辨率和 ( u , v ) (u,v) (u,v)计算纹理图像空间中的纹理坐标;
  3. 根据纹理坐标查找纹理贴图上对应位置的颜色值,并根据需求使用值变换函数调整颜色值得到最终的纹理颜色。

1.1 投影函数

投影函数的功能是将空间中的三维点转化为纹理坐标,即获取表面位置并将其投影到参数空间。常用的投影函数有球形、圆柱以及平面投影。

1.2 映射函数

映射函数的作用是将参数空间坐标转换为纹理空间位置。常见的映射函数有( u u u轴和 v v v轴可以使用不同的映射函数):

  • 重复寻址模式: 图像在表面上重复出现;
  • 镜像寻址模式:图像在表面上重复出现,每次重复时对图像进行镜像或反转处理;
  • 夹取寻址模式:在 [ 0.0 , 1.0 ] [0.0, 1.0] [0.0,1.0]之间复制纹理,对于 [ 0.0 , 1.0 ] [0.0, 1.0] [0.0,1.0]之外的内容,将边缘值沿着 u u u轴和 v v v轴进行延伸;
  • 边框颜色寻址模式:在 [ 0.0 , 1.0 ] [0.0, 1.0] [0.0,1.0]之间复制纹理,对于 [ 0.0 , 1.0 ] [0.0, 1.0] [0.0,1.0]之外的内容使用边框颜色填充。

二、体纹理

体纹理,也称为三维纹理。二维纹理是一张简单的位图图片,三维纹理由很多张二维纹理组成,通过三维纹理坐标进行访问,二维纹理为三维模型提供表面点的颜色值。
优点:三维位置可以直接用做纹理坐标,避免了二维参数化的变形和接缝问题;体纹理可用于表达木材和大理石等材料的结构,且表达较为逼真。
缺点:存储要求更高;滤波成本更高;使用体纹理作为表面纹理会很低效。因为体纹理中的大多数样本没有起到作用。

三、立方体贴图

用6幅二维纹理图像构成一个以原点为中心的纹理立方体,每幅二维纹理是一个立方体的一个面。对于每个片段,其纹理坐标 ( s , t , r ) (s, t, r) (s,t,r)被当作方向向量看待,每个纹素都表示从原点所看到的纹理立方体上的图像。
立方体贴图支持双线性滤波以及MipMapping,但问题可以可能会在贴图接缝处出现。处理立方体贴图专业的工具在滤波时考虑到了可能的各种因素,如ATI公司的CubeMapGen,采用来自其他面的相邻样本创建MipMap链,并考虑每个纹素的角度范围,可以得到比较不错的效果。

四、纹理缓存

在上传纹理到内存的开销和纹理单次消耗的内存量之间寻求一个好的平衡点。建议:保持纹理在不需要放大再用的前提下尽可能小,并尝试基于多边形将纹理分组。常见的纹理缓存策略:

  • 最近最少使用策略(Least Recently Used ,LRU)
  • 最近最常使用策略(Most Recently Used,MRU)
  • 预取策略(Prefetching)
  • 裁剪图策略(Clipmap)

五、纹理压缩

直接解决内存和带宽问题和缓存问题的一个解决方案是固定速率纹理压缩,通过硬件解码压缩纹理,纹理需要更少的纹理内存,从而增加有效的高速缓存大小。
几种纹理压缩模式:

  • DXT1:最精简,块占用为8个字节,即每个纹素占用4位。 与未压缩的24位RGB纹理相比,有着6:1的纹理压缩率。
  • DXT3、DXT5:块占用16个字节,或每个纹理元素8位。与未压缩的32位RGBA纹理相比,有着4:1的纹理压缩率。
  • ATI1:块占用8个字节,即每个纹素占用4位。与未压缩的8位单通道纹理相比,有着4:1的纹理压缩率。
  • ATI2:块占用16个字节,即每个纹理元素8位。与未压缩的16位双通道纹理相比,有着4:1的纹理压缩率。
  • ETC:快速解码,随机访问,无间接查找,速率固定。ETC算法将4×4纹素的块编码为64位,即每个纹理元素4位。每个2×4块(或4×2,取决于哪个质量更佳)存储基本颜色。

六、程序贴图纹理

也称为过程纹理,常用于离线渲染应用程序,而图像纹理在实时渲染中更为常见。过程纹理利用计算机算法生成的,旨在模拟自然元素的真实表面。常采用分形噪声(fractal noise)和湍流扰动函数(turbulence functions)来生成程序贴图纹理。

七、凹凸贴图及其改进

凹凸贴图及其改进方法的总结对比:
实时渲染学习(四)纹理贴图及相关技术_第2张图片
除了Displacement Mapping方法以外,其他的几种改进一般都是通过修改像素着色方程来实现,关键思想是访问纹理来修改表面的法线,而不是改变光照方程中的颜色分量。物体表面的几何法线保持不变,我们修改的只是照明方程中使用的法线值。

7.1 凹凸贴图 Bump Mapping

给平滑的表面,在不增加顶点的情况下,增加凹凸的变化。具体方法:改变表面光照方程的法线,而不是表面的几何法线,或对每个待渲染的像素在计算照明之前都要加上一个从高度图中找到的扰动,来模拟凹凸不平的视觉特征,如褶皱、波浪等等。

7.2 移位贴图 Displacement Mapping

也称为置换贴图、高度纹理贴图。移位贴图中每一个纹素存储了一个代表对应顶点位移的向量(纹素与顶点一一对应)。在顶点着色器阶段获取每个顶点的位移向量并将其施加到局部坐标系的顶点上,然后再进行MVP变换。

7.3 法线贴图 Normal Mapping

也称为Dot3(仿立方体)凹凸纹理贴图,将正确的法线值存储到一张纹理中,使用时直接从该纹理中获取即可。

7.4 视差贴图 Parallax Mapping

相比于普通的凹凸贴图,视差贴图更具真实感。视差贴图利用高度图进行了近似的纹理位移,替换渲染多边形上的顶点处的纹理坐标。

7.5 浮雕贴图 Relief Mapping

与视差贴图不同,浮雕贴图利用高度图进行了精确的纹理位移,所以在表现力上更完美,可以实现更深的凹凸深度。浮雕贴图还可以做出自阴影和闭塞效果。

后记

今天这篇内容丰富,花了很长时间通读和整理,图形学很有趣,要学好学精也需要付出更多的努力,加油!ヾ(◍°∇°◍)ノ゙

你可能感兴趣的:(图形学)