问题标签 [direct3d12]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5507 浏览

direct3d - Direct3D 编程新手:11 与 12

对于 D3D 编程的新手,应该直接学习 D3D12 还是在深入研究 D3D12 之前需要 D3D11?

假设从头开始并且对 C++ 有良好的了解,我应该走哪条路?

0 投票
2 回答
1373 浏览

c++ - GetCPUDescriptorHandleForHeapStart 堆栈损坏

在使用 DirectX 12.0 进行编程时,我偶然发现了一个相当不寻常的问题。到目前为止,还没有任何研究具有洞察力。

我正在使用 C(不是 C++)进行编程。看起来官方的 DirectX 12 标头支持 C 和 C++ 的绑定,但是编写 C 等效代码来执行上述任务会导致崩溃,而 C++ 则不会。我不相信错误是我的。

以下是详细信息:我的 D3D12 设备初始化过程中有以下代码块:

其中hRTV代表“渲染目标视图的句柄”(D3D12_CPU_DESCRIPTOR_HANDLE),而pRTVHeap代表“指向渲染目标视图堆的指针” (ID3D12DescriptorHeap)。

这是 C++ 等价物 - 这很好用:

不存在编译时错误,但在运行时,在 C 中调用此方法 (GetCPUDescriptorHandleForHeapStart) 会触发堆栈损坏(%ESP 被替换 4 个字节)。

我检查了该方法的反汇编并记下了 RET(返回)指令:

对于那些熟悉汇编和(希望)__stdcallCOM(组件对象模型)对象的调用约定的人this来说,在堆栈上传递的(或等效的)指针是第一个参数(在这种情况下,应该是唯一的参数)的方法,一种使 COM 对象能够访问自己的数据的做法。

以下代码片段(也显示在上面)引起了我的困惑,当运行时抛出“未对齐的堆栈指针/堆栈损坏”(%ESP)错误时,这是​​理所当然的:

在这种情况下,只应传递一个参数(this指针)。指针的大小(在 32 位系统上——我的目标架构是 x86)是 4 个字节(32 位),那么为什么被调用者清理堆栈上的 8 个字节呢?

我称这为错误是否正确?Microsoft 是否需要被告知此问题?我错了吗?

感谢您抽出宝贵的时间,希望比我有更多知识的人能启发我。请不要提出偏爱 C++ 而不是 C 的古老论点。

0 投票
0 回答
914 浏览

c++ - ID3D12GraphicsCommandList::Close() 返回 E_INVALIDARG

我正在关注 Direct3D12 上的 Rastertek 教程,可在此处找到。

我已经仔细检查以确保我的所有代码都与他的相同,但我遇到了命令列表的问题。当我在清除后台缓冲区后关闭命令列表时,该方法ID3D12GraphicsCommandList::Close()返回E_INVALIDARG,这意味着我在记录命令列表期间做错了什么。但是,我所做的一切似乎都没有错。

我的整个项目都可以在这个 github 分支上找到。

这段代码有什么问题?

似乎资源障碍是问题所在,但它们相当无害。注释掉OMSetRenderTargets()ClearRenderTargetView()仍然导致E_INVALIDARGClose().

我还尝试使用该ID3D12InfoQueue界面找出问题所在。返回错误时队列中没有消息Close()- 我已检查以确保接口正常工作,因为当发生其他错误时确实会显示消息。

0 投票
1 回答
1913 浏览

resize - ID3D11On12Device::AcquireWrappedResources() 中的额外交换链缓冲区引用

我对使用“Direct 3D 11 on 12”库很感兴趣,但是在调整窗口大小时遇到​​了麻烦。特别是,我正在修改 Visual Studio“DirectX 12 App”示例。

在示例创建 ID3D12CommandQueue 之后,我正在创建 ID3D11On12Device:

然后,当示例创建其渲染目标视图时,我添加了包装 ID3D11Resource 的创建:

然后,在创建了其余的 D3D12 资源之后,我正在测试 ID3D11On12Device::AcquireWrappedResources() 和 ID3D11On12Device::ReleaseWrappedResources() (只是作为测试,尽量使代码尽可能简单)

到目前为止,一切似乎都按预期工作。但是,在调整窗口大小时会出现问题。特别是,调整大小调用 IDXGISwapChain3::ResizeBuffers()。发生这种情况时,ResizeBuffers() 返回失败,并且控制台上显示以下消息:

我尝试在 ResizeBuffers() 之前清除 m_wrappedBackBuffers 引用:

但这似乎没有效果。我还尝试过对 ID3D11DeviceContext 进行 Flush()ing 和 ClearState()ing,但这些似乎没有效果或产生以下错误:

注释掉 ID3D11On12Device::AcquireWrappedResources() 和 ID3D11On12Device::ReleaseWrappedResources() 调用使 ResizeBuffers() 成功返回;但似乎需要调用这两个函数才能完全使用该库。

似乎在某个地方,ID3D11On12Device 或 ID3D11DeviceContext 保留了对交换链缓冲区的引用,但我无法找到任何有关如何在不破坏整个设备的情况下重置此引用的文档。

GitHub 上的这个问题似乎与我遇到的问题相同;但是,响应涉及“在 D2D 上下文中调用 SetTarget(nullptr)”,但我在这个项目中根本没有接触过 Direct2D(并且 Visual Studio 模板已经在 IDXGISwapChain3::ResizeBuffers() 之前调用了 WaitForGpu())。

Microsoft 的示例根本不包括交换链缓冲区大小调整。运行示例会导致交换链被拉伸以适应窗口。

我在 Microsoft 的文档中没有找到任何关于调整大小的信息。

0 投票
1 回答
1278 浏览

windows - 使用 GeForce 960M 在笔记本电脑上初始化 D3D12 调试接口失败

当我尝试使用标志 DXGI_CREATE_FACTORY_DEBUG 调用 D3D12GetDebugInterface 或 CreateDXGIFactory2 时,调用在我的笔记本电脑上失败,但在我的桌面上却没有。其他调用在笔记本电脑上工作正常,我可以渲染东西——我只是无法初始化调试层。台式机配备较旧的 GeForce 650 Ti,笔记本电脑是戴尔 XPS15 笔记本电脑(最新一代),配备 GeForce GTX 960M。两者都有最新的驱动程序 (361.43)。有什么想法可能会出错吗?

我首先在 NVIDIA devtalk 论坛上发帖,但因为官方 NVIDIA 论坛似乎已经死了,所以交叉发布到 stackoverflow。

0 投票
1 回答
783 浏览

c++ - 如何从位图文件创建纹理?

你能帮我找到等效的 DX12 API/示例代码,我可以通过它加载位图并创建纹理吗?

DX11 是D3DX11CreateShaderResourceViewFromFile,DX9 是D3DXCreateTextureFromFileEx

0 投票
4 回答
3874 浏览

c++ - 在 DX 12 VC++ 中从图像创建纹理

我只想知道 Directx 12 API 从图像创建纹理。

对于 DX11,它是 D3DX11CreateShaderResourceViewFromFile,对于 DX9,它是 D3DXCreateTextureFromFileEx,对于 DX12?

0 投票
1 回答
523 浏览

c++ - c++,directx 12:颜色选择问题

我想在 DirectX 12 中实现颜色选择。所以基本上我要做的是同时渲染到两个渲染目标。第一个渲染目标应该包含正常渲染,而第二个应该包含 objectID。

要渲染到两个渲染目标,我认为您需要做的就是使用 OMSetRenderTargets 设置它们。

问题 1:如何指定应将哪个着色器或管道状态对象用于特定的渲染目标?就像你怎么说render_target_0应该用shader_0渲染,render_target_1应该用shader_1渲染?

问题 2:渲染后如何从帧缓冲区中读取像素?是否像 DirectX 11 中使用 CopySubresourceRegion 然后使用 Map?你需要使用回读堆吗?您是否需要使用资源屏障或栅栏或某种同步原语来避免 CPU 和 GPU 同时使用帧缓冲区资源?

我尝试在谷歌上搜索答案,但并没有走得太远,因为 DirectX 12 非常新,而且还没有很多适用于 DirectX 12 的示例、教程或开源项目。

提前感谢您的帮助。

代码示例的额外特别奖励积分。

0 投票
1 回答
5153 浏览

directx-12 - D3D11 CreateTexture2D 的 D3D12 等价物是什么?

我是direct3d 编程的新手,我一直在构建一个简单的Windows 应用程序,用d3d12 依次显示4 个图像。我对 D3D12 架构有基本的了解,到目前为止,我已经创建了四个命令分配器 (backb buffer size = 4)、一个命令列表、一个命令队列、描述符堆和一个栅栏。我还使用 WIC 从文件中加载了我的图像。我知道我必须以某种方式将图像纹理数据作为资源。虽然那部分还不清楚,但我想澄清一下如何从 d3d12 中加载的图像中制作纹理。

0 投票
4 回答
6438 浏览

directdraw - 如何在 DirectX 12 中绘制文本?

这是您如何在 DirectX 11 中绘制文本的后续问题?

在 Direct3D-12 中,事情变得更加复杂,而且由于它是新的,我无法在网上找到任何合适的库。

我正在构建一个基本的 Direct3D12 FPS 测试应用程序,我喜欢在屏幕上显示 FPS 数据和我的渲染图像。