图形API学习工程(23):D3D12读取非DDS格式的CubeMap

工程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纹理”的流程是一样的:

  1. 先重置(Reset)一条命令链(ID3D12GraphicsCommandList)以备之后使用。
  2. 使用stb库来读取“纹理数据”。
  3. 创建 D3D12最终用的纹理资源
  4. 创建一个中间资源
  5. 将“纹理数据”指定到D3D12_SUBRESOURCE_DATA中。
  6. 使用UpdateSubresources来上传资源。需要用到:命令链D3D12最终用的纹理资源中间资源D3D12_SUBRESOURCE_DATA
  7. 使用命令链资源转换屏障D3D12最终用的纹理资源D3D12_RESOURCE_STATE_COPY_DEST转换为D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE
  8. 结束命令链的录制
  9. 创建D3D12_SHADER_RESOURCE_VIEW_DESC
  10. 执行命令链
  11. 等待执行完

创建CubeMap与普通2D纹理的不同

创建“普通2D纹理”和创建“CubeMap纹理”有少部分的不同:
在这里插入图片描述

  1. 读取“纹理数据”时是6张纹理图片。
  2. 创建D3D12最终用的纹理资源时,需要在描述中指定DepthOrArraySize6
  3. 创建中间资源在计算其大小时,GetRequiredIntermediateSizeNumSubresources需要填6
  4. 将“纹理数据”指定到D3D12_SUBRESOURCE_DATA中时,需要对应放到一个长度为6的数组中。
  5. 调用UpdateSubresources时,需要指定NumSubresources6
  6. 创建D3D12_SHADER_RESOURCE_VIEW_DESC时,指定ViewDimensionD3D12_SRV_DIMENSION_TEXTURECUBE

效果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013412391/article/details/114217259