工程GIT地址:https://gitee.com/yaksue/yaksue-graphics
目标
在《图形API学习工程(21):使用CubeMap纹理》中,由于DirectX读取CubeMap的教程范例都是DDS格式的纹理,因此我也首先实现了DDS的版本,期望之后做处理。
而在当时所参考的代码,与之前自己创建普通2D纹理的版本区别很大。最大的区别是使用了Placed resources
。于是我在上一篇博客《图形API学习工程(22):D3D12的“Committed Resources”和“Placed resources”》中对相关概念进行了学习。然后我重写了相关的代码,使其和之前自己创建普通2D纹理的版本相似。
本篇,则结合当前工程里“普通2D纹理”的创建过程与“DDS格式的CubeMap”的创建过程,最终可以使用非DDS格式的纹理来创建CubeMap。
创建纹理的流程
创建“普通2D纹理”和创建“CubeMap纹理”的流程是一样的:
- 先重置(Reset)一条
命令链(ID3D12GraphicsCommandList)
以备之后使用。 - 使用stb库来读取“纹理数据”。
- 创建 D3D12最终用的纹理资源。
- 创建一个中间资源。
- 将“纹理数据”指定到
D3D12_SUBRESOURCE_DATA
中。 - 使用
UpdateSubresources
来上传资源。需要用到:命令链
、 D3D12最终用的纹理资源、中间资源和D3D12_SUBRESOURCE_DATA
。 - 使用
命令链
的资源转换屏障将D3D12最终用的纹理资源从D3D12_RESOURCE_STATE_COPY_DEST
转换为D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE
。 - 结束
命令链
的录制 - 创建
D3D12_SHADER_RESOURCE_VIEW_DESC
- 执行命令链
- 等待执行完
创建CubeMap与普通2D纹理的不同
创建“普通2D纹理”和创建“CubeMap纹理”有少部分的不同:
- 读取“纹理数据”时是6张纹理图片。
- 创建D3D12最终用的纹理资源时,需要在描述中指定
DepthOrArraySize
为6
。 - 创建中间资源在计算其大小时,
GetRequiredIntermediateSize
的NumSubresources
需要填6
。 - 将“纹理数据”指定到
D3D12_SUBRESOURCE_DATA
中时,需要对应放到一个长度为6
的数组中。 - 调用
UpdateSubresources
时,需要指定NumSubresources
为6
。 - 创建
D3D12_SHADER_RESOURCE_VIEW_DESC
时,指定ViewDimension
为D3D12_SRV_DIMENSION_TEXTURECUBE
。