参考博文:【《Real-Time Rendering 3rd》 提炼总结】(五) 第六章 · 纹理贴图及相关技术
图像纹理中的像素通常被称为纹素(Texels)。纹理贴图过程的初始点一般基于模型空间,因为当模型移动时,纹理需要随之移动。纹理管线的具体流程如图:
纹理管线经过了三次变换过程:
投影函数的功能是将空间中的三维点转化为纹理坐标,即获取表面位置并将其投影到参数空间。常用的投影函数有球形、圆柱以及平面投影。
映射函数的作用是将参数空间坐标转换为纹理空间位置。常见的映射函数有( u u u轴和 v v v轴可以使用不同的映射函数):
体纹理,也称为三维纹理。二维纹理是一张简单的位图图片,三维纹理由很多张二维纹理组成,通过三维纹理坐标进行访问,二维纹理为三维模型提供表面点的颜色值。
优点:三维位置可以直接用做纹理坐标,避免了二维参数化的变形和接缝问题;体纹理可用于表达木材和大理石等材料的结构,且表达较为逼真。
缺点:存储要求更高;滤波成本更高;使用体纹理作为表面纹理会很低效。因为体纹理中的大多数样本没有起到作用。
用6幅二维纹理图像构成一个以原点为中心的纹理立方体,每幅二维纹理是一个立方体的一个面。对于每个片段,其纹理坐标 ( s , t , r ) (s, t, r) (s,t,r)被当作方向向量看待,每个纹素都表示从原点所看到的纹理立方体上的图像。
立方体贴图支持双线性滤波以及MipMapping,但问题可以可能会在贴图接缝处出现。处理立方体贴图专业的工具在滤波时考虑到了可能的各种因素,如ATI公司的CubeMapGen,采用来自其他面的相邻样本创建MipMap链,并考虑每个纹素的角度范围,可以得到比较不错的效果。
在上传纹理到内存的开销和纹理单次消耗的内存量之间寻求一个好的平衡点。建议:保持纹理在不需要放大再用的前提下尽可能小,并尝试基于多边形将纹理分组。常见的纹理缓存策略:
直接解决内存和带宽问题和缓存问题的一个解决方案是固定速率纹理压缩,通过硬件解码压缩纹理,纹理需要更少的纹理内存,从而增加有效的高速缓存大小。
几种纹理压缩模式:
也称为过程纹理,常用于离线渲染应用程序,而图像纹理在实时渲染中更为常见。过程纹理利用计算机算法生成的,旨在模拟自然元素的真实表面。常采用分形噪声(fractal noise)和湍流扰动函数(turbulence functions)来生成程序贴图纹理。
凹凸贴图及其改进方法的总结对比:
除了Displacement Mapping方法以外,其他的几种改进一般都是通过修改像素着色方程来实现,关键思想是访问纹理来修改表面的法线,而不是改变光照方程中的颜色分量。物体表面的几何法线保持不变,我们修改的只是照明方程中使用的法线值。
给平滑的表面,在不增加顶点的情况下,增加凹凸的变化。具体方法:改变表面光照方程的法线,而不是表面的几何法线,或对每个待渲染的像素在计算照明之前都要加上一个从高度图中找到的扰动,来模拟凹凸不平的视觉特征,如褶皱、波浪等等。
也称为置换贴图、高度纹理贴图。移位贴图中每一个纹素存储了一个代表对应顶点位移的向量(纹素与顶点一一对应)。在顶点着色器阶段获取每个顶点的位移向量并将其施加到局部坐标系的顶点上,然后再进行MVP变换。
也称为Dot3(仿立方体)凹凸纹理贴图,将正确的法线值存储到一张纹理中,使用时直接从该纹理中获取即可。
相比于普通的凹凸贴图,视差贴图更具真实感。视差贴图利用高度图进行了近似的纹理位移,替换渲染多边形上的顶点处的纹理坐标。
与视差贴图不同,浮雕贴图利用高度图进行了精确的纹理位移,所以在表现力上更完美,可以实现更深的凹凸深度。浮雕贴图还可以做出自阴影和闭塞效果。
今天这篇内容丰富,花了很长时间通读和整理,图形学很有趣,要学好学精也需要付出更多的努力,加油!ヾ(◍°∇°◍)ノ゙