(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~)
这一节讨论有关纹理映射的进阶内容:Cube Mapping。
1. 简介
单从名字上,就大概可以看出点端倪了,翻译成中文为立方体映射,因此肯定跟立方体有关系。确实,Cube Mapping就是使用六张正方形的图片来进行纹理映射的。这六张图片分别对应了一个立方体中的六个面。由于这个立方体是轴对齐的,因此每个面可以用坐标系中的六个轴方向来惟一的表示:正X面,负X面,正Y面,负Y面,正Z面,负Z面。我们把对应这六个面的六张纹理图,称之为“Cube Map”。 如下就是一张从立方体展开的Cube Map:
2. 纹理映射方法
通常情况下,纹理映射是通过顶点上的纹理坐标u,v来进行的。对于一个二维纹理来说,u,v就惟一确定了texel的位置。但对于一张Cube Map,仅仅给出u,v坐标是无法确定像素位置的,因为它有六张纹理图。因此,这时我们需要一种新的映射技术,以一对一地确定纹理中对应的texel。
实际上,在Cube Mapping中,映射是通过一个三维的向量实现的。该三维向量可以设想为以立方体的中心为起点,指向立方体外面。该向量与立方体的交点处对应的texel就是映射结果对应的texel。显然,一个三维向量与立方体有且仅有一个交点,因此这种方法可以用来实现立方体映射。
以下是在二维平面上进行的图示:v代表映射使用的向量,正方形代表cube map,图中给出的交点处对应的texel即我们要的结果。
下面我们从数学的角度来导出映射过程:
第一步,给出一个3D向量[x,y,z],首先找出值最大的那一维。以[-3.2, 5.1, -8.4]为例子, 这时最大维为Z,最大维用来把cube map从六张图定位到一张图上。-8.4为负数,对应了立方体的负Z面,因此接下来我们关注的焦点将是立方体负Z面对应的那张纹理;
第二步,把向量中另外两维分别除以最大维ÿ