球面环境映射 (Direct3D 9)

球面环境贴图或球体贴图是特殊纹理,包含对象周围的场景图像或对象周围的照明效果。 与立方环境映射不同,球体贴图不直接表示对象的环境。 “环境映射 (Direct3D 9) 主题中的茶壶图像显示了可以通过球体映射实现的反射效果。 球体贴图是对象周围场景的完整 360 度视图的 2D 表示形式,就像通过鱼眼镜头拍摄一样,如下图所示。

建筑物内部的球体图的插图

球面环境贴图的纹理坐标

为接收环境映射的每个顶点指定的纹理坐标应作为表面曲率产生的反射失真的函数来处理纹理。 应用程序必须计算每个顶点的这些纹理坐标才能达到所需的效果。 生成纹理坐标的一种简单而有效的方法使用顶点法线作为输入。 尽管存在多种方法,但以下公式在使用球体映射执行环境映射的应用程序中很常见。

计算球体贴图的纹理坐标的公式

在这些公式中,you 和 v 是正在计算的纹理坐标,NX 和 NY 是相机空间顶点法线的 x 和 y 分量。 公式简单但有效。 如果法线具有正 x 分量,则法线指向右侧,调整 u 坐标以适当处理纹理。 同样,对于 v 坐标:正 y 表示法线指向上。 对于每个组件中的负值,情况正好相反。

如果法线直接指向相机,则生成的坐标应不会收到失真。 两个坐标的 +0.5 偏差将零失真点置于球体贴图的中心, (0、0、z) 的顶点法线用于处理此点。 此公式不考虑法线的 z 分量,但使用该公式的应用程序可以通过跳过具有正 z 元素的法线顶点来优化计算。 这适用于平面着色对象,因为在相机空间中,如果离相机的正常点 (正 z) ,则会在呈现对象时剔除顶点。 对于 Gouraud 着色对象,法线可以指向远离相机 (正 x) ,并且包含顶点的三角形仍可见。 如果不计算此顶点的 you 和 v,可能仍使用人脸,从而导致意外行为。

应用球面环境映射

可以通过使用 IDirect3DDevice9::SetTexture 方法将纹理设置为适当的纹理阶段,以与任何其他纹理相同的方式将环境映射应用于对象。 将第一个参数设置为所需纹理阶段的索引,并将第二个参数设置为在为环境映射创建纹理时返回的 IDirect3DDevice9 接口的地址。 可以根据需要设置颜色和 alpha 混合操作和参数,以实现所需的纹理混合效果。

环境映射