问题标签 [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 投票
0 回答
87 浏览

c++ - 如何将 cudaArray 提供给 Windows-Machine-Learning 推理引擎?

我正在尝试为实时图像处理软件开发一个支持 ML 的插件,该插件cudaArray_t在 GPU 上提供图像数据,但由于该软件将我锁定在较旧的 CUDA 版本中,我想使用 DirectML(该软件无论如何都是Windows)。

出于延迟原因,我不想做任何不必要的 GPU-CPU-GPU 往返。为此,我认为我需要将 CUDA 数据映射到 D3D12 资源,然后可用于创建输入和输出张量以绑定到模型。我找到了一个示例,该示例使用 CUDA外部资源互操作性API 将 a 映射cudaArray_t到我试图作为代码基础的ID3D12Resource 此处。由于我不需要渲染任何东西,我认为我可以简单地创建堆和资源,然后将传入cudaArray_t的内容复制到互操作cudaArray_t中,如下所示,而无需创建任何类型的命令队列。请注意,缺少的代码与上面链接的 github 存储库中的代码相同,因此为了简洁起见,我将其省略了。

这种方法不起作用,但我不确定如何调试它,因为我通常是 Direct3D 编程和 GPU 编程的新手。我正在使用官方 Direct3D 12 文档作为参考,但它有点压倒性,因此非常感谢这里应该修复的一些方向 :) 我在想我需要使用信号量进行某种同步,但我不确定在不创建某种命令队列的情况下是否可行。

最后,如果映射到 aID3D12Resource可行,我假设可以使用ITensorStaticsNative 接口创建一个张量以绑定到LearningModel的输出或输入。

0 投票
1 回答
43 浏览

c++ - 远裁剪平面之外的对象在透视图中渲染

我在透视投影中看到了远裁剪平面之外的对象 ,我认为这不是它应该如何工作的,所以有人可以解释一下为什么我在这个例子中看到远裁剪平面之外的对象,例如网格。

顺便说一句,正交投影效果很好

我从这个演示中清除了所有形状,并通过更改Luna Frank Shapes Demo中的以下代码添加了两个网格

并更改网格大小

以及从调整大小开始的投影矩阵

现在我仍然可以看到网格,即使它超出了远平面,即使远平面是 900,它仍然会出现在屏幕边缘的旋转中。所以我需要减少远平面或进一步移动网格,当我不断改变远平面的值时,我可以看到一个形状就像画笔一样,它隐藏了它之外的所有东西,但是随着相机旋转并且网格不再在它的后面,网格重新出现

这就是我所说的刷子的意思

远剪裁平面之外的网格

0 投票
0 回答
22 浏览

direct3d12 - 是否可以更新 Direct3D 12 描述符范围或根签名?

考虑到以下用于声明根参数的描述符范围,是否可以在初始化后更改相应的根签名,使用给定的偏移值并设置一个新的OffsetInDescriptorsFromTableStart,或者每次我们想要应用更改时都必须重新创建根签名?

D3D12_DESCRIPTOR_RANGE我知道一个可能的解决方案是在这里为第二个描述符创建一个单独的描述符并用于SetGraphicsRootDescriptorTable()更新相应的根参数,但我想知道是否有某种方法可以利用描述符偏移参数。

0 投票
1 回答
131 浏览

graphics - 为什么需要为 D3D12 中的每一帧创建 GBuffers?

我有 D3D11 的经验并想学习 D3D12。我正在阅读官方 D3D12 多线程示例,但不明白为什么要为每一帧创建阴影贴图(在第一遍中作为 DSV 生成,在第二遍中作为 SRV 使用)(实际上只有 2 个副本,因为FrameResource被重用每 2 帧)。

创建阴影贴图资源的代码在此处,在FrameResource类中,其实例在此处创建。

实际上,每个帧都会创建另一个资源,即常量缓冲区。我有点理解常量缓冲区。因为是CPU写的(D3D11动态使用),需要保持不变直到GPU用完,所以需要2份。但是,我不明白为什么阴影贴图需要这样做,因为它仅由 GPU 修改(D3D11 默认使用),并且无论如何都有栅栏命令来分离对该纹理的读取和写入。只要 GPU 遵循围栏,单个纹理就足以让 GPU 正常工作。我哪里错了?

提前致谢。

编辑

根据下面的评论,我上面提到的“栅栏”应该更准确地称为“资源屏障”。

0 投票
4 回答
317 浏览

c - 从子 COM 对象获取父 COM 对象

ID3D12GraphicsCommandList接口继承自ID3D12CommandList. 那么,如果我有一个ID3D12GraphicsCommandList对象,我如何获得相应的ID3D12CommandList对象呢?

  1. 类型转换会起作用吗?
  1. QueryInterface 会起作用吗?
  1. 我需要做其他事情吗?

谢谢。

0 投票
1 回答
82 浏览

direct3d12 - 为什么 D3D12 样本使用 WM_PAINT?

如果您正在尝试编写游戏,您真的不应该等待WM_PAINT来自 O/S 的信号绘制。您应该尽快重复绘制。

那么为什么在 D3D 示例代码中发生渲染WM_PAINT

如何在不等待来自 O/S 的信号的情况下重新处理 D3D12 样本以尽快渲染?WM_PAINT

0 投票
1 回答
194 浏览

directx-12 - 无法使用 D3D12 渲染三角形

我想用 D3D12 渲染一个三角形,但它不起作用。我遵循了 Microsoft 的 Direct 3D Programming Guide。

我可以清除渲染目标视图,并在输出中成为 COMMAND_LIST_DRAW_VERTEX_BUFFER_TOO_SMALL 警告(DrawInstanced:输入顶点插槽 0 处的顶点缓冲区对于 Draw*() 调用期望遍历的内容不够大......)每一帧。所以我的想法是,问题出在顶点,应对顶点。

这是我的代码:

在输入布局中,我使用 DXGI_FORMAT_R32G32_FLOAT 和 D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA 作为位置。

在 PopulateCommandList 函数中:

0 投票
0 回答
51 浏览

unity3d - 是否可以使用 Unity 2021.2 之前的原生插件接口从 GPU 上复制原生顶点缓冲区

可以使用本机插件接口从 GPU 上复制本机顶点缓冲区吗?

我特别询问directx12vulkanmetal我知道这可以用directx11完成。此外,我只询问 2021.2 之前的 Unity 版本。

我可以使用以下 API:

或者

在directx12的情况下,

或者

如果是 vulkan,或者无论ResourceBarrier (dx12) 或AccessMode (vulkan) 是什么,我都会尝试将其应用于资源。

我确实尝试使用统一提供的命令队列以及创建自己的复制队列来运行一些测试代码,但没有任何反应。我只能怀疑这与本机缓冲区的资源状态有关,但我无法确定。

因为 Unity 没有发布任何关于本机网格缓冲区的初始资源状态 (StateBefore) 的信息,更不用说任何关于GetNativeVertexBufferPtr()根据当前获得的指针实际可以做什么的信息GraphicsDeviceType(除了简单的示例 @github)我感觉我不得不求助于发布这些问题。

编辑我将尝试根据需要提供更多详细信息

我正在尝试实现与Graphics.CopyBuffer()Unity 2021.2+ 中提供的功能类似的功能,仅适用于该版本之前的 Unity 版本。

我想复制从返回的指针指向的缓冲区的内容,Mesh.GetNativeVertexBufferPtr()以表示从GraphicsBuffer.GetNativeBufferPtr()or返回的缓冲区ComputeBuffer.GetNativeBufferPtr()。(缓冲区确实具有匹配的大小和步幅)。

重要的是不要使用任何可以将此数据取回托管内存的方法,而是直接在 GPU 上进行。

我已经设法DirectX11使用此接口使用本机插件来做到这一点:

Github - Unity-Technologies/NativeRenderingPlugin

但是当我尝试这样做DirectX12Vulkan使用上面提到的方法时,我做不到。因为示例插件代码库中的 Unity 在线手册和注释提供的帮助很少,我无法猜测可能是什么问题。

有谁确切地知道这种事情是否可以完成,或者我是否试图用 Unity 配置其网格的本机缓冲区的方式来做一些绝对不可能的事情?

0 投票
0 回答
12 浏览

direct3d12 - ID3D12GraphicsCommandList::ClearUnorderedAccessViewFloat 访问冲突读取位置

我收到以下运行时错误:

访问冲突读取位置 0x0000000000000140

但是,在访问冲突的位置(= 140 十六进制)之后只有 6 个字节的m_cpuUavHandle.ptr值。326320

由于在 Direct3d12 中您手动计算句柄地址,因此似乎存在出错的空间