请选择 进入手机版 | 继续访问电脑版

开源计算机图形学社区(Open Source Computer Graphics Community) |OpenGPU Forum (2007-2013)| OpenGPU Project

 找回密码
 注册
搜索
查看: 3039|回复: 5

D3D12 心得(一) [复制链接]

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

注册时间
2009-3-27
积分
4093
发表于 2015-9-15 01:44:38 |显示全部楼层
终于在不使用任何工程向导的情况下用纯D3D12画出了一个带贴图的三角形(如图),分享一下遇到过的坑,同时也请教一下大神们一些问题。


1. 虽然画出东西来了,但其实有很多东西都是看着MSDN的例子写的,其中一些做法和一些参数到底是什么意义根本不清楚,MSDN的文档也没说的很明白。例如:

(1).D3D12_COMMAND_LIST_TYPE。其他的都还好说,D3D12_COMMAND_LIST_TYPE_COPY就不明白什么意思了,例子里也没有使用过这个参数的,文档说的说明就等于没说 :
Specifies a command buffer for copying (drawing).

(2).创建 ID3D12GraphicsCommandList 的时候需要一个 ID3D12CommandAllocator 对象,而且不能为空,龚大神说 Allocator 和 CommandList 不是一对一的关系,也就是说一个 Allocator 可以为多个 CommandList 服务?在渲染的时候MSDN的例子都是每桢都要对 Allocator 和 CommandList 进行 Reset 操作,但是如果是一对多的情况会是怎样?



2. 创建资源上传资源数据。
D3D12上创建资源传数据比以前麻烦多了,不仅不能直接上传数据到 Default 的资源而且还需要自己做同步。
D3D12 上传数据给 Default 资源的流程是这样:

a创建一个Upload类型的资源 -> b把数据通过Map/WriteToSubresource等操作传到Upload资源中 -> c使用CopyResource/CopyTextureRegion/CopyBufferRegion 等操作把Upload的数据传到Default中

在进行c操作的时候建议使用 CopyResource ,原因~~使用简单...

这样做完之后并不意味着数据真正进行了拷贝,这个时候也不能释放Upload类型的对象,如果释放了再GPU进行真正拷贝的时候会报异常,只有当同步完成之后才能释放Upload对象。

这里就有一个问题了,龚大神说这个同步在以前也有只不过是驱动代劳了,那现在D3D12把同步开出来要用户自己做的意义是什么呢?难道有优化空间?怎么优化?
我这种低智商的只能想到再场景加载的时候不用每个资源都进行一次同步,而是成批加载然后同步一次。想法是好但是使用的时候确实另一回事。一般引擎在包装的时候都是给出很好用的方法,比如 LoadTextureFromFile , LoadMeshFromFile , LoadAnimFromFile。这些方法在返回的时候必须是完全加载完毕的,因为第一在这些函数返回前需要释放 Upload 对象,否则就没有机会了,因为一般这个Upload对象都是创建在 Load 函数中的临时对象;第二你并不知道用户在什么去用,很有可能用户在调用这些方法时候已经是在场景中了(比如动态创建的Object),用户的需求是当函数返回之后我就需要立刻使用。这就导致 LoadXXX / CreateXXX  这种函数根本做不到成批创建资源然后一次同步。



3. 我在用D3D12时候遇到的一些坑:

(1). CreateSwapChainXXX 族函数的第一个参数文档中写的是 :
pDevice [in] A pointer to the Direct3D device for the swap chain. This parameter cannot be NULL.
但如果输入一个D3D对象则会创建失败,这里应该给的是一个ID3D12CommandQueue 对象

(2). 创建资源的时候使用 CreateCommittedResource,其中参数 D3D12_RESOURCE_DESC 中的 Width 项在创建不同类型资源的时候意义不一样。创建 Buffer 的时候的意义是字节数,在创建 Texture 时候的意义是一行的 Texel 的个数(不是像以前一样是 texture 的pitch)

(3). 上传数据。在对Texture进行数据上传的时候需要注意不能使用 Map,必须需用 WriteToSubresource,但是 WriteToSubresource 需要 Map 之后才可以。对 Texture 进行Map 的时候最后一个参数必须是 nullptr ,否则 D3D 会返回一个异常,说 Layout 是 Unknow 的资源不能进行 Map。



4. 一些问题。

(1). ID3D12RootSignature 这货到现在也没具体搞清楚是个啥。
a. RootSignature 每个应用只能创建一个(MSDN)
b. 每个能进行渲染 PSO 在创建时必须指定 RootSignature
c. 每个能进行渲染 PSO 在创建时必须给定 VS/GS/PS ,一旦创建完毕无法更改
这就是说在创建 RootSignature 的时候必须要知道所有有可能使用的 Shader ,并为其预留 SRV/Sampler 的插槽?

(2). D3D12_STATIC_SAMPLER_DESC 中的 RegisterSpace 指的是什么?
MSDN的例子:Texture2D<float4> a : register(t2, space3);
对应在程序里面到底是啥?

(3).关于同步。
上面说过Upload资源必须在同步之后才能释放,但是怎么才算同步?
为什么问这个问题呢,因为我尝试 CopyResource 的时候在调用 ExecuteCommandLists之后,Signal/SetEventOnCompletion/WaitForSingleObject 之前就把 Upload 资源释放了,结果也没报错,运行一切正常。

Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28

注册时间
2009-3-31
积分
14321
发表于 2015-9-15 03:09:33 |显示全部楼层
1. 不是啊,root signature可以创建很多个。我现在是每个shader组合创建一个。
2. 我还没用static sampler。这个很可能是static的映射到实际register的索引。
3. Signal/SetEventOnCompletion/WaitForSingleObject之后才是同步完成。否则有可能会挂。

使用道具 举报

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

注册时间
2009-3-27
积分
4093
发表于 2015-9-15 03:51:20 |显示全部楼层
本帖最后由 Phantom 于 2015-9-15 03:52 编辑
gongminmin 发表于 2015-9-15 03:09
1. 不是啊,root signature可以创建很多个。我现在是每个shader组合创建一个。
2. 我还没用static sampler ...

MSDN里面关于 Root Signatures 的第一段

The root signature defines what resources are bound to the graphics pipeline. A root signature is configured by the app and links command lists to the resources the shaders require. Currently, there is one graphics and one compute root signature per app.

https://msdn.microsoft.com/EN-US/library/windows/desktop/dn899208(v=vs.85).aspx

使用道具 举报

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

注册时间
2010-3-27
积分
5846
发表于 2015-9-15 09:31:50 |显示全部楼层
大神来开荒,我们跟着走。

使用道具 举报

Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28

注册时间
2009-3-31
积分
14321
发表于 2015-9-15 11:28:20 |显示全部楼层
Phantom 发表于 2015-9-15 03:51
MSDN里面关于 Root Signatures 的第一段

The root signature defines what resources are bound to the g ...

但实际情况并非如此,应该是文档没更新。MiniEngine里也是那么用的,一个app好多root signature。

使用道具 举报

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

注册时间
2009-3-27
积分
4093
发表于 2015-9-15 16:32:41 |显示全部楼层
这是有多少坑啊

使用道具 举报

最近看过此主题的会员

您需要登录后才可以回帖 登录 | 注册

‹‹
我的工具栏

关于我们|手机版|Archiver|开源计算机图形学社区(Open Source Computer Graphics Community) | OpenGPU Project | OpenGPU Forum (2007-2013)

GMT+8, 2017-5-29 13:47 , Processed in 0.055009 second(s), 12 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部