Direct3D 12 尝鲜(五): SDK 更新

时间:2022-10-10 23:40:10
(转载请注明出处)

又是一个月, 微软在Build2015中公布了不少关于Win10的新闻, 又在N卡公布的支持DX12显卡中看到了我的垃圾显卡(GT640M LE)居然在支持范围,高高兴兴地直接换物理机安装上Win10, 升级了SDK, VS2015变成了RC版. 不过失望了是显卡支持的仅仅是D3D12 level11.0, 不能用level12.0,不知道会不会更新支持.

Win10SDK也更新了, 我们在意的自然是D3D12部分. 对于目前, 改变如下:
1. Helper类/函数 被分离到了direct3dx12还是什么的头文件里面, 但是我翻遍了SDK也没有这个文件,目测在DXSDK里面
2. 函数名/函数参数个数/参数顺序改变
3. 交换链细节改变

前面两个都是无足轻重的, 最多就是麻烦点, 比如新的创建函数

HRESULT WINAPI D3D12CreateDevice(
_In_opt_ IUnknown *pAdapter,
D3D_FEATURE_LEVEL MinimumFeatureLevel,
_In_ REFIID riid,
_Out_opt_ void **ppDevice
);

只有四个参数了, 比如要选择软件渲染有点麻烦了,需要枚举显卡适配器了.

好的,现在说一下关于交换链的, 在D3D10, 11 以及之前的12中, 交换链可以自动旋转, 比如我们有个交换链有两个缓冲AB.

之前我们写入A, 旋转交换链后, 之后再渲染, 就是自动写入B了.
现在交换后, 还是写入A, 微软说的是为了减少CPU开销.但是我们现在渲染就稍微麻烦了.现在自己还没找到合适的方法.

目前的解决方法一般三种:
1. 每次呈现都修改CommandList
2. 创建数倍于缓冲区的CommandList, 针对不同缓冲区写入
3. 再创建一个临时缓冲区, 都写入到这个缓冲区里面, 呈现时再送入不同的缓冲区.

这里, 我选择的是2, 浪费一点内存, 以换取效率.
这次的例子就仅仅将代码更新, 这次好像能与DirectComposition组件完美交互了:
Direct3D 12 尝鲜(五): SDK 更新

更新后的代码下载地址:
点击这里