问题标签 [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.
direct3d12 - 如何将 D3D11On12 渲染目标映射到内存?
我正在尝试将屏幕外 D2D 渲染目标映射到内存。
- 渲染目标被创建为
ID3D12Resource
withD3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET
- 然后通过
ID3D11On12Device::CreateWrappedResource()
- 然后做成一个
ID2D1Bitmap1
withID2D1DeviceContext2::CreateBitmapFromDxgiSurface
该应用程序使用 D2D 对其进行绘制,然后将其用作 D3D12 着色器中的像素着色器资源,我可以通过这种方式验证纹理的内容是否正确。
但是,如果我通过 将它复制到D3D12_HEAP_TYPE_READBACK
资源CopyTextureRegion
,它会返回完全设置为 0。我使用的代码适用于其他纹理。我在D3D11DeviceContext
刷新后尝试过,并且在完成屏幕呈现后也尝试过。
我也尝试在 D2D 领域中复制和映射它,但我得到了相同的结果。我觉得这个资源在某种程度上很特别,我错过了一些东西。
runtime-error - D3D12 错误:基于 GPU 的验证:绘制,访问了未初始化的根参数。着色器阶段:PIXEL,根参数索引:[1]
这花了我一段时间才成为 D3D12 新手,但我没有在网上找到任何东西。着色器编译得很好,获得了所有资源,但输出一直是黑色的。在将调试级别设置为最大值并启用 GPU 验证后,我收到了错误消息,然后是某种汇编程序跟踪和操作数转储。
directx - 支持 RTX 2060 和 D3D12 的 mGPU(多 GPU)AFR 可能吗?
是否可以使用两个 RTX 2060 显卡在 D3D12 中进行 AFR?
我有一个支持 AFR 和 D3D12 的自定义渲染框架,但刚刚阅读了 Nvidia 放弃了 SLI 支持,但是我很难找到一个明确的答案来说明这对于 D3D12 / Vulkan API 意味着什么。他们是否只放弃了 SLI 驱动程序支持,但 Linked-GPU 支持在 D3D12 中仍然正常工作?
如果我购买了两张 RTX 2060 显卡,我可以在 Windows 中将它们设置为“ GPU 0 (Link 0) & GPU 1 (Link 0) ”,然后在 D3D12 中将它们用作节点组吗?
我想将 RayTracing 添加到我的 API 中,但想用它测试 AFR / mGPU 支持,并且 Nvidia 已经不清楚这对 D3D12 / Vulkan 意味着什么。
raytracing - 内联光线追踪的绑定
我有一个小项目,我正在试验 D3D12 光线追踪(或者我想要)。我设置了一个带有 BLAS 和 TLAS 的场景。我想将此 TLAS 与内联光线跟踪一起使用。我的 TLAS 现在处于 UAV 状态(使用 D3D12_RESOURCE_BARRIER_TYPE_UAV)。在我的 HLSL 中,我声明我的根签名如下:
我现在的困境是,如何将我的 TLAS 绑定到rayTracingScene
. 如果我尝试 SetGraphicsRootShaderResourceView,则会出现错误:
D3D12 错误:ID3D12CommandList::SetGraphicsRootShaderResourceView:资源(0x000001BDEB5FAA60:'TLAS')的资源状态(0x400000:D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE)(子资源:0)对于用作根着色器资源无效。Expected State Bits (all): 0xC0: D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE|D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, Actual State: 0x400000: D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE, Missing State: 0xC0: D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE|D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE. 此验证在命令列表记录期间在绑定时强制执行,因为根签名中此资源的描述符声明为 DATA_STATIC_WHILE_SET_AT_EXECUTE。[执行错误#538:INVALID_SUBRESOURCE_STATE]
我无法将 TLAS 资源的状态更改为,D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE|D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE
所以我现在不走运。
我一直在寻找内联光线追踪教程,但它们都只涵盖着色器,而不是 C++ 和根签名的绑定。
如果你有一些提示甚至更好;代码,请帮助我继续前进。
c++ - Direct3D 12 你好,世界!样本问题。窗口启动但没有图形
我正在阅读以下初学者教程:https ://docs.microsoft.com/en-us/samples/microsoft/directx-graphics-samples/d3d12-hello-world-samples-win32
当我构建,然后运行项目时,我会得到一个带有正确项目标题的窗口,但它会启动,然后在一秒钟左右后消失。它显示一个空白的白色窗口,没有任何类型的图形或任何东西。
你认为可能是什么问题?它正在构建和运行,没有任何错误,所以我一无所知。屏幕截图通常比 1,000 个单词要好,所以我附上了我所构建和运行的每个项目的屏幕截图。有关如何使其正常工作的任何建议?
我正在运行:Window 10 OS Build:19042.685 版本:20H2
c++ - 在 Direct3D 12 应用程序中,全屏真的比窗口模式更好吗?
我正在尝试学习 Direct3D 12 来做一些简单的 3D 图形来获得乐趣。
我听说纯全屏是获得最大 fps 的方法,但现在我正在测试它,全屏似乎比窗口模式差得多。
例如,WS_BORDER
窗口上的静态颜色(全屏大小)并Windowed
设置为TRUE
,DXGI_SWAP_CHAIN_FULLSCREEN_DESC
可以在我的计算机上以大约 5000 fps 的速度渲染(使用三重缓冲)。
另一方面,WS_POPUP
窗口上的静态颜色,Windowed
设置为FALSE
并且DXGI_SWAP_CHAIN_FULLSCREEN_DESC
也IDXGISwapChain3::SetFullscreenState(TRUE, nullptr)
称为,仅以大约 3000 fps 的速度渲染(使用三重缓冲)。
应该是这种情况还是我错过了什么?
hlsl - Direct3D12 - 哪个 RootSignature 优先?
我是 MSFT 和 DirectX 的新手,所以请放轻松。
如果 hlsl 着色器使用该[RootSignature(SignatureName)]
属性,它会被代码中定义的根签名覆盖ID3D12RootSignature
吗?
例如,在示例代码中,我在一个着色器包含的 .hlsli 文件中有这个:
在着色器中:
是否会被使用以下内容创建的根签名覆盖或覆盖:
ASSERT_SUCCEEDED( g_Device->CreateRootSignature(1, pOutBlob->GetBufferPointer(), pOutBlob->GetBufferSize(), MY_IID_PPV_ARGS(&m_Signature)) );
game-engine - 我可以在执行时安全地更改着色器可见 DescriptorHeap 的内容吗
根据描述符堆概述 - 同步,更改执行中引用的描述符(通过 ID3D12GraphicsCommandList::SetGraphicsRootDescriptorTable)可能会调用竞争条件。
但是我可以安全地更改当前执行中未引用的描述符吗?引用描述符和非引用描述符都在同一个 DescriptorHeap 中,并且通过调用 ID3D12GraphicsCommandList::SetDescriptorHeaps 将堆设置为 CommandList。
directx - 使用 OBS 捕获窗口时 D3D12 对象访问错误消息
我正在研究一个简单的 Direct3D12 示例,它工作正常,但是当我尝试使用 OBS(开放广播软件)捕获我的应用程序窗口时,Visual Studio 输出报告以下错误消息:
[OBS] d3d12 共享贴图采集成功
D3D12 错误:ID3D12CommandQueue::ExecuteCommandLists: 非同时访问纹理资源 (0x000001B7CFCA9520:'未命名对象') 仍被另一个命令队列 (0x000001B7C912BD10:'未命名 ID3D12CommandQueue 对象') 上运行中的 write|transition_barrier GPU 操作引用。现在在此命令队列(0x000001B7D005FB90:'Unnamed ID3D12CommandQueue Object')上启动 transition_barrier GPU 操作是不安全的。这可能导致竞争条件和应用程序不稳定。[执行错误#1047:OBJECT_ACCESSED_WHILE_STILL_IN_USE]
[OBS] ----------------- d3d12 捕获释放 ----------------
这是我的示例代码的链接。
我的问题是 OBS 做了什么导致这个错误代码,我该如何适当地解决它?
directx-12 - 是否可以在 DirectX 12 桌面应用程序中将 HDR 与 MSAA 结合使用?
使用 DirectX 12 的 DirectX 工具包,我能够成功编译和运行各个 MSAA 和 HDR 教程示例。但是,当我将 MSAA 和 HDR 组件的相关代码组合到一个Game.cpp文件中时,编译失败并显示调试层消息:
D3D12 错误:ID3D12CommandList::ResolveSubresource:指定的格式与源资源不兼容。格式:R10G10B10A2_UNORM,源资源格式:R16G16B16A16_FLOAT [RESOURCE_MANIPULATION ERROR #878:RESOLVESUBRESOURCE_INVALID_FORMAT]
我正在为 SDR 显示监视器使用 HDR 示例代码,因此需要应用色调映射。关于调用的顺序,我在尝试解析 MSAA 渲染目标之前调用结束 HDR 场景:
然后在 MSAA 解析块之后,我将色调映射语句放置如下:
我发现在设置描述符堆以绘制 2D 精灵(在 3D 场景上)之前尝试色调映射会导致错误:
D3D12 错误:CGraphicsCommandList::SetGraphicsRootDescriptorTable:包含句柄 0x80000253a82ff205 的描述符堆 (0x0000025428203230:'DescriptorHeap') 与当前设置的描述符堆 0x0000025428203540:'EffectTextureFactory' 不同。[执行错误#708:SET_DESCRIPTOR_TABLE_INVALID] D3D12:为上一条消息启用了BREAK,即:[错误执行#708:SET_DESCRIPTOR_TABLE_INVALID]
我承认这是第一次尝试将 HDR 和 MSAA 结合起来相当天真,但我担心这些功能在 DirectX 12 中可能不兼容和/或相互排斥。我理解为什么在 MSAA 解决过程中会出现资源兼容性问题,因为我们需要为 HDR 使用浮点渲染目标。我应该注意,如果我通过将m_msaa boolean 设置为false来跳过 MSAA 代码块,我的程序将使用 HDR 正确运行和渲染。
期待任何人可能有的任何建议。如果需要足够的代码或有关程序的其他详细信息,我很乐意更新我的帖子。