Foundation 施工笔记 【5】- 纹理与延后渲染初步
Preface Editor暂时还没有任何关于光照,甚至是texture map的相关实现。本篇文章将介绍纹理方面的高效存储及Editor GBuffer的布局,及PBR shading的初步测试。 容器格式 不看轮子和各种私有格式的话,常用的主要有DDS和最近的KTX2。 KTX 虽然工具链很成熟,在新版Vulkan Tutorial中也被绝赞推荐:但由于全平台支持,直接使用的话由于各种编码产生的依赖会多的离谱(--depth=1 clone大小约莫~1GB!),因此这里没有选择。 DDS 最后挑的还是DDS,因为容器本身很简单:"DXT " + DDS_HEADER + DDS_HEADER_DXT10后即为对应编码下linear tiled数据,可以分成layer/mip直接上传 GPU。至于为什么不应该(Linear Tiling)整个上传(或者,GPU上的纹理到存储方式为什么是硬件相关的),请参考 Image Copies - Vulkan Documentation。 实现上主要是读文档——部分结构直接从DirectXTex - DDS.h copy过来了。用DDS有一个好处就是能被第三方工具直接打开,同时,Editor序列化纹理也将如此存储。 纹理格式 运行时解码成全精度,原始的R8G8B8A8UNORM等格式存储诚然是…一种选择。不过记得之前和某个Unity游戏打交道见过其在资产里直接存了原始RGB565(RGB 16 bit)量化格式的纹理做NPR 效果。但是至于为什么要用这种格式,搜了半天也没找到个结果(汗) 纹理压缩,可能除了UI带alpha材质的极端情况外,基本是必做的事情。GPU硬件解码其支持的格式开销是几乎不存在的——参考 Unity 给出的材质格式推荐: DXTc/BCn/ETC 桌面端,支持最广泛的包括各种BCn/Block Compression [n]压缩 - 参见 Understanding BCn Texture Compression Formats - Nathan Reed;同时,BC1,BC2,BC3 也被微软叫成 DXT1, DXT3, DXT5,这里提及以防混淆。最后,在近十年支持DX11级别的桌面硬件中,无脑使用BC6(H),BC7 基本没问题。 移动端,ETC曾是主流:Unity的crunch就提供第一方DTXc/BCn和ETC的支持。现在的移动硬件一概支持更优秀且开源的ASTC:Unity自己也在使用ARM官方的开源astc-codec处理编码。但需要注意的是,桌面硬件上对astc的支持几乎不存在。这点也可以自己利用Vulkan Caps Viewer检查: Basis Universal 可见硬件上——上述压缩编码在桌面/移动端的支持是没有交集的。但是纹理压缩做的工作本身会有很多重叠(如 DCT编码等等)—— basisu 即可高效地存储一种统一编码格式,并在运行时非常快速地转换到目标平台使用编码上传GPU。 额外的,basisu也自带一层哈夫曼编码 - 这是在所有block处理完之后全局进行的,因此整体压缩率在相同平均bpp下也会比单纯的BCn等编码一般地会更高。 BC7 最后在GPU和文件本身存储上还是采用了BC7 - Editor内置了来自crunch作者Richard Geldreich 的 bc7enc 实现。这样也方便直接读取并直接转码JPG/PNG存储的glTF模型纹理。...