cubeToUV
cubeToUV
将立方体贴图用的三维方向向量映射为“Cube‑UV”二维纹理坐标,并在方块边缘按 texel 尺寸做避让,避免接缝与采样泄漏。
核心优势
把 Cubemap 采样转换为 2D 纹理图集采样,跨平台稳定,便于与 PMREM 生成的 Cube‑UV 环境贴图配合;内置按像素的边缝避让,无需手写展平逻辑。
常见用途
在不支持硬件立方体 LOD 的平台上实现 IBL 反射与折射
作为 textureCubeUV 的底层方向→UV 映射工具
自定义基于方向的 2D 环境贴图采样与特效
如何调整
唯一可调参数为 texelSizeY。设为 1/纹理高度。线性过滤建议使用 2 个 texel 的边缘避让(本实现已采用 2),NEAREST 可减为 1。若避让不足会在方块边界出现接缝或错采样,过大则会压缩可用采样区域。
代码示例
1// 计算反射方向
2const dir = reflect( positionViewDirection.negate(), normalWorld );
3
4// 计算每像素高度,用基础 mip 层尺寸求倒数
5const texSize = textureSize( pmremTexture, int(0) );
6const texelSizeY = float(1.0).div( texSize.y );
7
8// 方向→Cube‑UV
9const uvCube = cubeToUV( dir, texelSizeY );
10
11// 用得到的 UV 直接采样 2D 环境贴图
12const envColor = texture( pmremTexture, uvCube );