体积纹理是位图图像,其中包含三维信息,通常用于仿真诸如雾或烟的体积效果,模拟体积 3D 网格,或存储动画纹理并在这些动画纹理之间平滑混合。

数据结构

体积纹理的数据结构相较于普通的 2D 纹理会多一个维度:

TEXT
Width × Height × Channels × Depth
点击展开查看更多

相当于多张 2D 纹理堆叠起来。

Shader 中采样

  • GLSL
GLSL
uniform sampler3D my3DTexture;
xxx xxx() {
    vec3 uvw = vec3(0.5, 0.5, 0.5);
    vec4 color = texture(my3DTexture, uvw);
}
点击展开查看更多
  • HLSL
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 来说,除了更高的显存需求,还需要重点关注显存带宽,有时候不是算得慢,而是数据搬得慢。

MipMap

3D Texture 有原生的 MipMap 支持。 这在体渲染中很重要,远处 volume 若不用 mip,高频细节导致随机访问,cache 很难预判。使用低 MipMap 后数据更小、命中率更高、带宽下降。

Volume Texture 的制作

要制作 Volume Texture 需要将 3D 体数据切成很多 2D 切片,独立存放在普通的图片文件中。

Texassemble

来自微软 DirectXTex 项目,用于将多张独立图像合成为包含立方体贴图、体积贴图或纹理数组的 DDS 文件。官方Wiki

BASH
texassemble volume -o output.dds -f R8G8B8A8_UNORM slice_*.png
点击展开查看更多

Powershell 需要使用 (Get-ChildItem slice_*.jpg)

KTX Tools

Khronos Group 出品的一套命令行工具,用于创建、验证和处理 KTX 格式的纹理容器。官方Wiki 目前各引擎对 KTX 格式支持较差。

BASH
ktx create --format R8G8B8A8_UNORM --depth 256 slice_*.png output.ktx2
点击展开查看更多

Powershell 需要使用 (Get-ChildItem slice_*.jpg)

旧范式: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 展示或输入,因为可视化方便直观、便于编辑、导出兼容性高。

版权声明

作者: Cheyne Xie

链接: https://chaim.eu.org/posts/c54e94ed/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键