体积纹理是位图图像,其中包含三维信息,通常用于仿真诸如雾或烟的体积效果,模拟体积 3D 网格,或存储动画纹理并在这些动画纹理之间平滑混合。
Volume Texture 与 3D Texture
可以理解成 Volume Texture 是其中一种 3D Texture,诸如 Cube Texture 这些在广义上也能称为 3D Texture;但是如果 3D Texture 是在图形、技术侧的语境下(如 OpenGL 中的 GL_TEXTURE_3D、HLSL 中的 Texture3D)指的就是 Volume Texture。
数据结构
体积纹理的数据结构相较于普通的 2D 纹理会多一个维度:
Width × Height × Channels × Depth相当于多张 2D 纹理堆叠起来。
Shader 中采样
- GLSL
uniform sampler3D my3DTexture;
xxx xxx() {
vec3 uvw = vec3(0.5, 0.5, 0.5);
vec4 color = texture(my3DTexture, uvw);
}- HLSL
Texture3D my3DTexture : register(t0);
SamplerState mySampler : register(s0);
xxx xxx() {
float3 uvw = float3(0.5, 0.5, 0.5);
float4 color = my3DTexture.Sample(mySampler, uvw);
}现代 GPU 优化
在现代 GPU 中有许多针对 3D Texture 的优化,如:
- 小块 3D bricks(例如
4×4×4/8×8×8) - Morton/Z-order
- vendor proprietary swizzle 这样 XYZ 邻近访问快,cache 命中率提升。 对于 3D Texture 来说,除了更高的显存需求,还需要重点关注显存带宽,有时候不是算得慢,而是数据搬得慢。
对比 Texture2DArray
Texture2DArray 每层是离散的,第 N 层就是第 N 层,通常不会自动跨层插值,也就不会有线性过滤。
MipMap
3D Texture 有原生的 MipMap 支持。 这在体渲染中很重要,远处 volume 若不用 mip,高频细节导致随机访问,cache 很难预判。使用低 MipMap 后数据更小、命中率更高、带宽下降。
Volume Texture 的制作
要制作 Volume Texture 需要将 3D 体数据切成很多 2D 切片,独立存放在普通的图片文件中。
Texassemble
来自微软 DirectXTex 项目,用于将多张独立图像合成为包含立方体贴图、体积贴图或纹理数组的 DDS 文件。官方Wiki
texassemble volume -o output.dds -f R8G8B8A8_UNORM slice_*.pngPowershell 需要使用 (Get-ChildItem slice_*.jpg)
KTX Tools
Khronos Group 出品的一套命令行工具,用于创建、验证和处理 KTX 格式的纹理容器。官方Wiki 目前各引擎对 KTX 格式支持较差。
ktx create --format R8G8B8A8_UNORM --depth 256 slice_*.png output.ktx2Powershell 需要使用 (Get-ChildItem slice_*.jpg)
切片顺序问题
要注意切片文件读取的顺序,用足够大位数作为序号,如数量<1000的要用三位:000、001、002…否则可能会出现乱序的情况。
Unity 支持
截至 Unity 6.3,Unity 都不原生支持这两种格式的 Volume Texture 导入,需要打包成 3D Texture Atlas,导入后在 Inspector 中设置为 3D 类型。
旧范式:3D Texture Atlas
3D Texture Atlas 是一种经典的体积数据打包方法:把3D体数据切成很多2D切片,平铺进一张或多张2D纹理里,再在shader里手动采样重建体积。
例如,将一张图分成 16×16 分块,每块代表一个 Z Slice,总共 16×16 = 256 层,于是组成一个 256 深度的体积纹理。像把一本 CT 扫描切片册,摊平成一张海报。
什么地方还会用到?
- 旧平台 某些平台仍会用 atlas 替代 3D texture,尤其老设备。
- 移动端优化 部分移动 GPU 对 3D texture bandwidth 不理想,atlas 有时更可控。
- Flipbook / VFX 很多“伪体积烟雾火焰”仍然是 atlas 动画,而非真实 volume。
- 工具链产物 像 Adobe Substance 3D Designer 某些节点,会把 volume 以 slice atlas 展示或输入,因为可视化方便直观、便于编辑、导出兼容性高。