DirectX 12 – Cube Mapping 立方体贴图映射

本章节中,我们将学习cube map。所谓cube map,其由包含6张贴图的组成并以特殊的方式呈现。有了cube mapping,我们可以轻而易举的通过贴图表现天空或者模型的反射。

目标

1. 了解什么是cube map,而在HLSL中如何对其进行采样。

2. 学会如何通过DX的贴图工具来创建cube map。

3. 学会如何使用cube maps来表现模型的反射。

4. 学会如何将cube map用作球体的贴图以模拟天空与远处的高山。

18.1 Cube Mapping(立方体贴图映射)

cube mapping的原理就是存储6张贴图并将其显示为立方体的6个面——因此被命名为cube map——其位于坐标系的中心且与坐标轴对齐。因为立方体贴图与坐标轴对其,所以立方体的每一个面对应三个坐标轴的方向;而坐标轴的方向(±X,±Y,±Z)将会对应贴图特定的面。

在DX中,cube map由包含6个成员的贴图数组代表:

1. 索引0表示+X的面

2. 索引1表示-X的面

3. 索引2表示+Y的面

4. 索引3表示-Y的面

5. 索引4表示+Z的面

6. 索引5表示-Z的面

与2D贴图不同,我们不能通过一个2D贴图坐标来读取cube map中的texel,而需要使用3D贴图坐标。该3D贴图坐标由一个3D的lookup(查询)向量v表示,其位于坐标系原点。向量v与cube map的交点处的texel就是坐标v在cube map中所对应的texel。在第九章中所学习的贴图filtering也同样适用于cube map,例如向量v与cube map的交点正好位于贴图中两个texel之间。

lookup向量的长度并不重要,因为我们只需要它的方向。两个lookup向量,长度不同,但方向相同,那么它们在cube map中的采样点将会是相同的。

在HLSL代码中,立方体贴图由TextureCube表示。以下代码展示了如何采样一个cube map:

// HLSL
TextureCube gCubeMap;
SamplerState gsamLinearWrap : register(s2);

...

// 像素着色器
float3 v = float3(x, y, z); // lookup向量

需要注意的是lookup向量与cube map需要位于同一坐标系。例如,cube map位于世界坐标系(cube map中的每一个面都与世界坐标系的三个轴对其),那么lookup向量的坐标值也应该基于世界坐标系。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据