Direct X 12 – Texture 贴图

9.3 贴图的数据源

游戏行业中常见的创建贴图的方法是美术在PS或者其他图形编辑器中创建并存储图片,而格式一般为BMP,DDS,TGA或者PNG。之后游戏再读取图像的数据将其存入ID3D12Resource对象。对于实时渲染的应用,DDS(Direct Draw Surface格式)更被大家青睐,因为其支持不同的GPU所支持的图像格式;尤其是其压缩格式能够直接由GPU进行解压缩。

美术并不应该使用DDS格式作为其工作的图像格式。只有在贴图完成并作为引擎资源时再将其输出为DDS格式。

9.3.1 DDS总览

DDS格式是理想的游戏贴图格式是因为其支持实时渲染的应用所特有的格式类型。该类型是专门为GPU准备的。例如,DDS贴图支持以下特性:

1. mipmaps

2. GPU可以直接解压的压缩格式

3. 贴图数组

4. cube maps

5. 体积贴图(volume texture)

DDS格式能够支持不同的像素格式。而像素格式由枚举DXGI_FORMAT的成员表示;然而,并不是所有的格式都适用于DDS贴图。对于非压缩的图像数据,我们可以使用以下格式:

1. DXGI_FORMAT_B8G8R8A8_UNORM / DXGI_FORMAT_B8G8R8X8_UNORM:用于LDR的图像。

2. DXGI_FORMAT_R16G16B16A16_FLOAT:用于HDR的图像。

贴图对于GPU内存空间的需求增长得非常快,由于游戏中的虚拟世界由上百张贴图构成(我们将所有这些贴图存放在GPU内存空间中,当使用贴图时,速度也会更快)。为了缓解贴图内存的增加,DX12支持多种压缩的贴图格式:BC1,BC2,BC3,BC4,BC5,BC6和BC7:

1. BC1(DXGI_FORMAT_BC1_UNORM):支持3个颜色成员(RGB)和一个只有1位(true/false)的alpha成员.

2. BC2(DXGI_FORMAT_BC2_UNORM):支持3个颜色成员,和1个4位的alpha成员。

3. BC3(DXGI_FORMAT_BC3_UNORM):支持3个颜色成员,和1个8位的alpha成员。

4. BC4(DXGI_FORMAT_BC4_UNORM):支持1个颜色成员(例如,灰度图)。

5. BC5(DXGI_FORMAT_BC5_UNORM):支持2个颜色成员。

6. BC6(DXGI_FORMAT_BC6_UF16):支持HDR图像数据。

7. BC7(DXGI_FORMAT_BC7_UNORM):支持高质量的RGBA压缩。该格式能显著减少由压缩的法线贴图造成的错误。

压缩贴图只能被用作渲染管线中的着色器的输入参数,并不能用作render target。

由于贴图的压缩算法是基于4×4的像素块,贴图的尺寸必须是4的倍数。

使用以上贴图格式的好处是,其在压缩状态下存储于GPU内存空间中,之后还能够直接由GPU进行解压,这将大大减少GPU内存空间的占有率。同时,压缩为DDS格式的贴图也能够减少硬盘空间的占有率。

9.3.2 创建DDS

如果大家并不熟悉图形编程,大多数时间使用的贴图格式为BMP,TGA或者PNG。以下是两种将传统贴图格式转换为DDS格式的方法:

1. NVIDIA提供了一个PS的插件,其可以将图像导出为DDS格式。https://developer.nvidia.com/nvidia-texture-tools-adobe-photoshop

2. 微软提供了一个命令行工具texconv,其能个将传统格式的图像转换为DDS。此外该工具还能用于改变图片尺寸,改变限速格式,生成mipmaps等等。大家可以通过以下链接下载该工具并阅览其文档https://directxtex.codeplex.com/wikipage?title=Texconv&referringTitle=Documentation

以下命令将可以将输入的BMP文件转换为DDS格式,文件名为treeArray.dds,切像素格式为DC3_UNORM并生成10个mipmaps。

texconv -m 10 -f BC3_UNORM treeArray.dds

微软还提供了一个名为texassemble的工具,其可以创建存有贴图数组,volume maps和cube maps的DDS文件。我们将在之后的章节使用该工具。通过以下链接可以下载该工具并找到相关文档https://directxtex.codeplex.com/wikipage?title=Texassemble&referringTitle=Documentation

VS2015拥有内置的图形编辑器,其支持DDS格式。你可以将一张图片拖入VS15,之后VS2015将在编辑器中打开该图片。对于DDS格式的文件,你可以看见其mipmap,改变DDS格式或者观察每一个颜色通道。

《Direct X 12 – Texture 贴图》有5条留言

  1. 老铁,这本书的中译版正在走最后阶段,预计今年就要出版了……
    而且这本书坑很多,如果要翻译造福大家,请用心……
    谢谢!

    回复
    • 哈哈,中文版已经要出版啦,是在审核还是在翻译?是程序员翻译的么,还是那种大学老师翻译的?写这本书的老铁感觉没有写dx11时那么认真,里面有些东西直接从上一本拷过来。。坑的话我觉得还行吧,就是一些要点容易遗漏。。。

      回复
      • 已经在最后审核期了,大约几个月后就能出了吧~
        如果不是这些坑,这本书的中文版半年前可能就已经出来了……
        十分同意老铁的感觉,尤其是改得还不彻底,还漏了些东西。
        最坑的是阿三带领的微软团队,随着win10的更新方式的更改,隔半年就有新特性、新函数加进去,简直是坑神之神吗~ XD
        另外,题外话,就冲着win10,我感觉GitHub早晚要被微软玩儿坏……
        应该说算是程序员翻译的,之前做过相关的东西,我觉得中译本质量应该还算说得过去,如果出版社不坑的话……到现在,这本书已经翻译快满两年了,一个人翻译的……
        不管怎么说,也要感谢老铁在业余时间给大伙分享技术!
        DX 12与福尔康一样,偏底层,不好(容易)玩儿,到现在也没见有谁正经用它优化,做出什么强大的游戏来……
        您翻译的速度还真是挺快的……orz
        我记得今年八月rtr 4th就要来了,如果能翻译好,定是国内图形界的福音啦~ 🙂

        回复
        • 额。。。两年也太久了吧,辛苦啦,哈哈。我是觉得翻译的话,对书中知识点的理解挺有用的,如果只是粗略地看比较容易漏。。
          DX12可能还是微软自己旗下的工作室在用吧,这一个世代的xbx one肯定还是DX11为主。。看看下一代主机上新的话能不能普及DX12

          回复
          • 扎心啊,老铁!
            里面的事儿太多太杂,水深啊……如果愿意的话,届时买一本(估摸也不太可能……)看看就明白了……不过他马上就要弄完了,好歹算了了这件心事儿啦……据说裤衩都要当出去鸟……
            总是在黑暗的角落里暗想,这玩意儿也许他们自己也不会使的,驱动配合、无穷更新……统统加起来这玩意儿其实……
            嗯,这次1803倒没更新什么东西,说明相对趋于稳定了,或许这个节骨眼儿上发出中译本是个合适的时机?谁知道捏……
            最后再贫一句话,书里的错误有软有硬,所以就算是一字一句对着翻出来,结果也可想而知,这就是为什么这本要花那么长时间准备的原因之一啦,老铁!所以,我才会说如果要翻译给大家看,要用心啦……

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据