学习笔记:基础纹理

《UnityShader入门精要》第7章

Posted by zhuowl on November 24, 2017

1 纹理的名词

  • 纹理映射技术:把纹理映射到物体表面
  • 纹素(texel)
  • 纹理映射坐标(texture-mapping coordinates):定义了该顶点在纹理中对应的2D坐标,也被称为 UV坐标

2 凹凸映射

凹凸映射(bump mapping):使用一张纹理来修改模型表面的法线,以便为模型提供更多的细节 不会真的改变模型的的顶点位置 分为2种: 高度映射 和 法线映射

2.1 高度映射

高度映射(height mapping):使用一张高度纹理(height map)来模拟表面位移(displacement) 高度映射

2.2 法线映射

法线映射(normal mapping):使用一张法线纹理(normal map)来直接存储表面法线 辐射度

3计算光照模型

需要计算光照模型中统一各个方向矢量所在的坐标空间。

法线纹理中存储的法线是在切线空间中

计算光照模型 有两种选择:

  • a. 在切线空间下进行光照计算,需要把光照方向、视角方向变换到切线空间下
  • b. 在世界空间下进行光照计算,把采样得到的法线方向变换到世界坐标下,再和世界空间下的光照方向和视角方向计算

效率:a >b
原因:
方法a可以直接在顶点着色器中就完成对 光照方向、视角方向 的计算
方法b需要对法线纹理进行采样,所以变换过程必须在 片元着色器中实现,也就是需要在片元着色器中进行一次矩阵操作

通用性:b>a
有时需要在世界空间下进行一些计算
例如使用Cubemap进行环境映射,需要使用世界空间下的反射方向对Cubemap进行采样
如果同时需要法线映射,需要将法线方向变换到世界空间下

3.1 在切线空间下计算光照模型

基本思路:在 片元着色器中通过 纹理采样得到 切线空间下,然后再与切线空间下的视角方向 、光照方向进行计算。
顶点着色器中把ViewDir视角方向和LightDir光线方向从objec space模型空间变换到tangent space切线空间

3.2 在世界空间下计算光照模型

基本思路:在顶点着色器中计算从切线空间到世界空间的变换矩阵TBN,并把它传递到片元着色器
注意:在需要Cubemap进行环境映射的时候需要这种方法

4 纹理

纹理可以用于存储任何表面属性

4.1 渐变纹理

渐变纹理 常见的用法之一:使用渐变纹理来控制漫反射光照的结果 渐变纹理

4.2 遮罩纹理mask texture

允许保护某些区域,使它们免于某些修改。
遮罩纹理可以让美术人员更加精确(像素级别)(逐像素)的控制模型表面的各种性质
常见用处
● 应用在制作地形材质时,使用遮罩纹理可以控制混合这些纹理
● 使用遮罩纹理控制光照,使得模型的某些区域光照强烈,某些区域光照弱一些

流程
● 通过采样得到遮罩纹理的纹素texel值
● 使用其中某个(或某几个)通道的值(例如texel.r)来与某种表面属性进行相乘
● 当通道值为0时,可以保护该表面不受该属性的影响