问题标签 [directx-12]
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.
directx - DirectX 12 更新描述符堆
我目前正在为 DirectX12 编写自己的图形框架(我已经为个人游戏引擎编写了几个 DirectX 11 框架),并且我目前正在尝试复制最近的 Hitman 游戏中用于资源绑定的方法。
我对处理 SRV/CBV/UAV 堆的每个对象资源绑定的最佳方式感到困惑。我看过几个 GDC 演示文稿,它们似乎都掩盖了这一点。
一次只能绑定 1 个 SRV/CBV/UAV 堆,并且在命令列表中间切换当前绑定的堆可能会因强制刷新而对某些硬件的性能不利。因此,使用新描述符更新堆的最佳方法是什么?对我来说,似乎每个命令列表都会:
- 为自己获取一个 SRV/CBV/UAV 堆。
- 对于对象子集中的每个对象,在堆上创建描述符,指向放置在单独上传堆中的每个对象数据。
- 之后,另一个命令列表获取这个填充的描述符堆并绑定它,然后发出混合的绘制调用
SetGraphicsRootDescriptorTable
,以便在当前描述符堆中移动。
话虽如此,一些在线资源(包括另一篇 SO 帖子)建议使用一个大型 SRV/CBV/UAV 堆并使用 CPU 可见堆复制到其中。我假设他们没有尝试使用 asynchronous CopyDescriptors
,而是CopyBufferRegion
. 我尝试使用CopyBufferRegion
来更新每个对象的数据,但对我来说,这似乎表现不佳,因为D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER
和之间有如此多的转换D3D12_RESOURCE_STATE_COPY_DEST
。我是不是误会了什么?任何清晰度将不胜感激。
directx-12 - 使用堆类型上传更新 GPU 资源的最佳方法是什么?
我正在使用ID3D12Resource::Map
方法来更新 GPU 资源。这是最有效的方法吗?存在哪些替代方案?
directx-12 - 在 D3D12 中,渲染目标视图可以是任何缓冲区吗?
到目前为止,在我查看的示例中,一些命令类似于:
- D3D12_DESCRIPTOR_HEAP_DESC 与 D3D12_DESCRIPTOR_HEAP_TYPE::D3D12_DESCRIPTOR_HEAP_TYPE_RTV
- ID3D12Device::CreateDescriptorHeap
- 带有 ID3D12DescriptorHeap::GetCPUDescriptorHandleForHeapStart 的 D3D12_CPU_DESCRIPTOR_HANDLE(可能还有 ID3D12Device::GetDescriptorHandleIncrementSize)
- (可选?)ID3D12Device::CreateRenderTargetView
- (可选?)IDXGISwapChain3::GetBuffer
- 将渲染内容安排到命令列表,注意 OMSetRenderTargets 和 DrawInstanced,然后关闭命令列表。
- ID3D12CommandQueue::ExecuteCommandLists
- (可选?)IDXGISwapChain3::Present
- 在栅栏上使用 ID3D12CommandQueue::Signal 调度信号
- 等待 GPU 完成 ID3D12Fence::SetEventOnCompletion 和 WaitForSingleObjectEx
如果可能,如何将步骤 4.1 替换为选择的缓冲区?即如何创建一个 ID3D12Resource* 并呈现给它,然后从中读取到一个 std::vector?(我假设是否可以忽略步骤 6.1,因为没有可供交换链呈现的渲染目标视图。在这种情况下,也许步骤 4 也是不必要的?也许只有 OMSetRenderTargets 很重要?)
directx - 没有 UWP 的 DirectX 11/12 可能吗?
自 DX9 时代以来,我还没有研究过 DirectX。是否可以制作 DX11/12 应用程序而不必同时制作 UWP 应用程序?
我有点担心 UWP 的开销——为了好玩,我创建了一个空应用程序,我注意到它使用 ~30MB 来绘制一个空白窗口。
texture-mapping - 使用动态索引时 DirectX 12 中出现奇怪的纹理故障
最近,我在我的引擎中实现了纹理加载。但是纹理有时会出现一些小故障。
问题如下图所示。 在此处输入图像描述
这是用 AMD R9 380 测试的。我也尝试在 Intel Graphic HD 4600 上执行我的程序,但它什么也没画。(没有显示几何形状。)
我的着色器代码:
我已经仔细检查了 matData.gDiffuseMapIndex,它是正确的。
我尝试了一切来解决这个问题,但徒劳无功。直到我将代码修改为:
这工作正常!
我的 R9 380 没有故障。
并且所有几何图形都在 HD 4600 上正常显示。
但为什么!?
为什么我需要使用 for 循环再次检查索引以防止出现故障?
(如果我使用更多纹理,这可能无法有效地工作。)
什么会导致这个问题?
我整晚都在想这个问题,但我找不到答案。
谢谢!
完整的着色器代码: 在此处输入链接描述
c++ - 使用 Directx 9 的屏幕空间反射
我想使用directx9 c++实现屏幕空间反射,但不知道如何开始,直到我研究了很多文章但只得到了像 http://roar11.com/2015/07/screen-space-glossy-reflections/这样的着色器代码 http: //casual-effects.blogspot.in/2014/08/screen-space-ray-tracing.html
所以请让我开始和使用屏幕空间反射的着色器
directx - 扩展间接命令缓冲区时,ExecuteIndirect 在 AMD GPU 上崩溃
我尝试使用 ExecuteIndirect 来绘制我的实例。
这是我的代码:
附加间接命令缓冲区:
更新间接命令缓冲区数据:
最后,间接执行
我使用我的 SceneManager 来加载场景。如果一个游戏对象是一个渲染对象。我的系统将调用 AppendIndirectCommandBuffer() 并将数据复制到间接命令缓冲区中。
如果我在场景初始化后不克隆我的游戏对象,ExecuteIndirect() 会很好用。
我尝试在运行时克隆我的游戏对象(在我的 Update() 中)。
我的系统再次调用 AppendIndirectCommandBuffer() 来调整间接命令缓冲区的大小并将新数据复制到缓冲区。
克隆游戏对象几秒钟后,我的系统开始出现故障并导致我的 R9 380 上出现 TDR。
但在 WARP 和 intel gpu 上都能正常工作。
而且我不知道为什么:(。
如何解决这个问题呢?我真的很想善用间接绘图。
谢谢!
更新
上传堆资源无法传输到 D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT。
我创建了一个默认类型的堆,并使用上传堆将数据复制到它。
我尝试了调试层,没有返回任何错误。我尝试了 GBV,但只有两个错误:
并发出警告:
在我调用以下函数后,这两个错误就消失了。
尽管进行了这些修改,它仍然无法正常工作。
cmake - 如何在cmake中获取路径上的所有目录名称?
我想写一个cmake脚本来找到directx 12 sdk的目录。该目录位于$ENV{ProgramFiles}/Windows Kits/10/Include/
. 但是,在这条路径上,它有许多不同版本的 SDK,它们存储在不同的目录中。如10.0.10150、10.0.10240、10.0.10586等。
我不知道SDK有多少版本。所以我想获取这条路径上的所有目录。但是我该怎么办?像这样的目录:
- $ENV{ProgramFiles}/Windows 工具包/10/Include/
- 10.0.10150
- 10.0.10240
- 10.0.10586
谢谢。
directx-12 - 如何将刚刚复制到复制队列中的资源转换为复制队列不支持的状态?
我使用队列将数据D3D12_HEAP_TYPE_DEFAULT
从D3D12_HEAP_TYPE_UPLOAD
中间缓冲区复制到缓冲区。D3D12_COMMAND_LIST_TYPE_COPY
复制完成后,我需要将资源转换回D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER
. 但是复制队列不支持转换到这种状态。我怎样才能正确地做到这一点?
我是否应该在复制后立即插入栅栏,然后在图形队列上等待这个栅栏并在那里执行转换,这不是很舒服的选择。还有其他可能吗?