11.3 对天空进行纹理映射
在本节中,我们使用一个环境贴图对天空进行纹理映射。我们创建了一个包围整个场景的椭
圆体(用椭圆体来模拟一个较为平坦的天空表面)。我们通过图 11.6 所示的方法,使用一
个环境贴图对椭圆体进行纹理映射,将环境贴图投影到椭圆体表面上,模拟天地相接处的远
山假象。
图 11.6:为简单起见,我们在 2D空间中描述这一概念;读者可以把这个正方形想像为一个 3D空间中的
立方体,把这个椭圆形想像为一个 3D 空间中的椭圆体。我们假设天空和环境贴图的中心均与坐标系原点
对齐。然后,我们对椭圆体表面上的点进行纹理映射,使用从原点指向表面点的向量作为立方体贴图的查
找向量,将立方体贴图投影到椭圆体上。
我们假设天空椭圆体无限遥远(即,它的中心与世界空间的原点对齐,但是有无限大的半径),
无论摄像机如何在世界空间中移动,我们永远都无法靠近或远离天空椭圆体表面。要实现这
个无限遥远的天空,我们只需要在世界空间中将天空椭圆体的中心和摄像机的位置对齐,让
它跟着摄像机移动。这样无论摄像机移动到哪,我们都不会靠近天空椭圆体表面。如果不这
样做,那么当摄像机与天空椭圆体表面越来越近时,整个假象就会被拆穿,我们用来模拟天
空的这个小把戏就没什么意思了。
用来实现天空的效果文件如下:
cbuffer cbPerFrame