立方体贴图 Cubemap
什么是立方体贴图
立方体贴图(Cubemap)是一种特殊的纹理,由六个独立的2D纹理组成,分别对应于立方体的六个面:正X、负X、正Y、负Y、正Z、负Z。这六个面共同表示从立方体中心点向周围空间观察到的全景图像。
在着色器中,通过一个三维方向向量来采样立方体贴图,GPU会根据方向向量选择适当的纹理面并进行插值。
立方体贴图的用途
- **天空盒(Skybox)**:渲染场景背景,模拟远处环境。
- **环境映射(Environment Mapping)**:用于反射和折射效果,模拟物体表面对周围环境的反射。
- **基于图像的光照(IBL)**:存储预计算的环境光照信息,用于PBR材质。
- **动态反射**:可以实时渲染场景到立方体贴图,实现动态反射。
- **光照探针**:在特定位置捕获环境光照,用于对动态物体进行间接光照。
创建立方体贴图
立方体贴图可以通过以下方式创建:
- **静态图像**:使用6张正方形纹理,分别对应六个面,导入引擎并设置为Cubemap。
- **全景图转换**:将等距柱状投影(Equirectangular)的全景图转换为立方体贴图。
- **实时渲染**:在场景中放置摄像机,渲染六个方向到渲染目标,生成动态Cubemap。
- **生成HDR环境贴图**:使用工具(如Substance、Blender)烘焙。
立方体贴图的采样
在着色器中,使用`samplerCUBE`(或`TextureCube`)进行采样。采样时需要一个三维方向向量,该向量从立方体中心指向采样方向。GPU会找到与该方向相交的立方体面,并返回对应纹理坐标处的颜色。
立方体贴图与Mipmap
立方体贴图支持Mipmap链,每个mip级别是原分辨率的缩小版。在反射和IBL中,常使用粗糙度来选择mip级别,模拟不同粗糙度表面的模糊反射。
立方体贴图的注意事项
- **接缝**:如果六个面边缘不一致,可能出现可见接缝。确保纹理边缘无缝对接。
- **方向约定**:不同引擎可能对立方体贴图的面布局和方向有不同约定(如Y轴翻转),导入时需注意。
- **内存占用**:立方体贴图包含六个面,内存是普通2D纹理的6倍,注意优化。
- **性能**:动态生成立方体贴图需要渲染场景六次,开销较大,应谨慎使用。
总结
立方体贴图是实现环境效果的基础,广泛应用于现代渲染管线。
常见问题
立方体贴图和2D纹理有什么区别?
2D纹理使用UV坐标采样,立方体贴图使用3D方向向量采样,能够表示全方位环境。立方体贴图由六个2D纹理组成。
如何生成立方体贴图?
可以使用6张正方形图片,或从全景图转换,也可以实时渲染场景到六个面。许多引擎提供工具自动生成。
立方体贴图在PBR中如何使用?
在基于图像的光照(IBL)中,立方体贴图存储环境辐射度,用于计算间接漫反射和镜面反射。常使用预滤波的mipmap来近似不同粗糙度的反射。
为什么立方体贴图有接缝?
接缝通常由于六个面纹理在边缘处不连续,或者采样时滤波不一致。解决方法包括使用无缝纹理、启用无缝立方体贴图采样(如果硬件支持)。
如何优化立方体贴图的内存?
降低分辨率、使用压缩格式(如BC6H用于HDR)、只存储必要的mip级别。在移动平台,可以考虑使用预卷积的辐照度图和预滤波环境图。