现在我想了解Directx 12并阅读msdn.它说
工作示例随SDK一起安装,演示如下:
我在这里找到了d3d C:\Program Files (x86)\Windows Kits\10\Redist\D3D
但是Directx 12的样本在哪里?Thansks.
我有一个计算着色器,我想将其输出到图像/缓冲区,该图像/缓冲区旨在作为两个管线(计算管线和图形管线)之间的中间存储。图形管道实际上是一个“虚拟”,因为它除了将中间缓冲区的内容复制到交换链映像中外没有任何作用。DX12弃用了计算管道使用UAVS直接写入交换链映像的功能,因此需要这样做。
在Vulkan的意义上,我认为中间存储应该是“临时”附件:
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT指定绑定到该映像的内存将被分配VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT(有关更多详细信息,请参见“内存分配”)。可以为可用于创建VkImageView适合用作颜色,分辨力,深度/模板或输入附件的任何图像设置此位。
这在解释这篇文章:
最后,Vulkan包含临时附件的概念。这些是帧缓冲区附件,它们在渲染通道开始时以未初始化或清除的状态开始,由一个或多个子通道写入,被一个或多个子通道消耗,并最终在渲染通道结束时被丢弃。在这种情况下,附件中的数据仅存在于渲染通道中,而无需将其写入主内存。尽管我们仍将为此类附件分配内存,但是数据可能永远不会离开GPU,而只会驻留在缓存中。这样可以节省带宽,减少等待时间并提高电源效率。
DirectX 12是否具有类似的图像使用概念?
在 Vulkan 中,内存资源是通过“视图”中包含的“类指针”元数据来访问的,该元数据描述了应该如何解释内存资源。描述符是向着色器指定该内存将位于“何处”的数据。
在 DirectX 12 中,资源是“内存资源”的缩写(请参阅:https ://www.3dgep.com/learning-directx12-1/ )。资源视图是对允许特定使用的资源的包装。例如,“着色器资源视图”(SRV) 允许着色器访问资源,而“无序访问视图”与 SRV 类似,只不过它允许以任何顺序访问数据。
“恒定缓冲区视图”(CBV) 允许着色器访问比平常更持久/恒定的数据。DirectX 12 文档似乎没有区分 CBV 和常量缓冲区。例如,标题为“Constant Buffer View”的文章说道:
常量缓冲区包含着色器常量数据。它们的价值在于数据会持续存在,并且可以由任何 GPU 着色器访问,直到需要更改数据为止。
任何地方都没有提到“视图”这个词,就好像资源和资源视图之间没有区别一样。文档中发生这种情况的另一个地方是关于资源绑定的文章:
最常见的资源是:
- 恒定缓冲区视图 (CBV)
- 无序访问视图(无人机)
- 着色器资源视图 (SRV)
- 采样器
在列出公共资源时,本文提到了资源视图,就好像它们是同一件事一样。
DirectX 12 中的资源和资源视图有什么区别?
我正在尝试学习 DirectX 12,我在 github 上找到了这些教程。我下载了所有东西,并尝试运行 HelloWindow 项目。我在 Debug->Options->Linker->Input 中链接了 d3d12.lib。不幸的是,它给了我一堆来自 d3dx12.h 的错误。对于其中的大多数,Intellisense 说要包含 d3d12.h,即使我已经这样做了。例如,D3D12_RESOURCE_DESC1 是未定义的,他的所有属性也是如此。如果是,请帮助我,我是否错过了什么。
因此,我创建了一个项目并将本教程复制到其中。当我尝试运行它时,它给了我这个错误:C2102 & requires l-value在
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET));
我搜索了很多,但没有找到适合上下文的内容。我能做些什么来修复它?
我正在 Visual Studio Community 2019 中开发我的第一个 DirectX 12 C++ 应用程序,但无法从 Visual Studio 输出窗口中的调试日志输出中获取有用信息。
我的问题是我试图通过调用CreateSwapChain创建交换链,但对此函数的调用失败并出现 HRESULT,并产生以下错误消息:
应用程序进行了无效的调用。调用的参数或某些对象的状态不正确。启用 D3D 调试层以便通过调试消息查看详细信息。
除此之外,我还可以在“输出”窗口中看到 Visual Studio 的标准调试输出。它显示加载了哪些 .dll 文件以及引发了异常。我不相信任何输出来自 DirectX。
为了启用调试层,我尝试以下代码,从WinMain函数的第一行开始:
#if defined(DEBUG) || defined(_DEBUG)
Microsoft::WRL::ComPtr<ID3D12Debug> debugController;
ThrowIfFailed(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)));
debugController->EnableDebugLayer();
#endif
此外,我运行 dxcpl.exe 打开 DirectX 控制面板,将可执行文件添加到范围列表中,然后为 Direct3D/DXGI 调试层选项选择“应用程序控制”单选按钮。
我通过选择“调试”->“开始调试”再次执行代码,在 Visual Studio 输出窗口中,我现在可以看到从“D3D12”报告的信息消息,例如:
...
D3D12 INFO: Create ID3D12CommandAllocator: Addr=0x0C3CBD78, ExtRef=1, IntRef=0 [ STATE_CREATION          INFO #558: CREATE_COMMANDALLOCATOR]
D3D12 INFO: Create ID3D12GraphicsCommandList: Addr=0x0C42EA78, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #560: CREATE_COMMANDLIST12]
D3D12 INFO: Create ID3D12GraphicsCommandList: Addr=0x0C479C68, …到目前为止,在我查看的示例中,一些命令类似于:
如果可能,如何用选择的缓冲区替换步骤 4.1?即如何创建一个 ID3D12Resource* 并呈现给它,然后从中读取到 std::vector 中?(我假设如果这可能,步骤 6.1 可以被忽略,因为交换链没有呈现目标视图。在这种情况下,也许步骤 4 也是不必要的?也许只有 OMSetRenderTargets 重要?)
我正在学习“使用 DirectX 12 进行 3D 游戏编程简介”。在初始化 d3d(第 4 章)中运行示例代码,当我想使用 4xmsaa 时,发生了错误,如下图所示,请帮助我。 错误的数字
我有两个纹理和一个纹理数组。我试图将两个纹理绑定到 t1,将纹理数组绑定到 t2。hlsl 可能喜欢这个
Texture2D    gDiffuseMap : register(t0);
Texture2DArray gDiffuseMaps : register(t1);
我创建了一个有 2 个描述符的描述符范围。
CD3DX12_DESCRIPTOR_RANGE texTable;
texTable.Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 2, 0);
但我不知道如何将描述符绑定到寄存器。
directx-12 ×10
c++ ×2
direct3d ×1
direct3d12 ×1
directx ×1
hlsl ×1
msaa ×1
msdn ×1
visual-c++ ×1
vulkan ×1
windows ×1
windows-10 ×1