问题标签 [directcompute]

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 回答
671 浏览

direct3d - 是否可以使用 HLSL 计算着色器写入非 4 字节对齐的地址?

我正在尝试将现有的 OpenCL 内核转换为 HLSL 计算着色器。

OpenCL 内核对 RGBA 纹理中的每个像素进行采样,并将每个颜色通道写入一个紧密封装的数组。

uchar所以基本上,我需要以类似于这样的模式写入一个紧凑的数组:

其中每个字母代表源自像素通道的单个字节(红色/绿色/蓝色/阿尔法)。

RWByteAddressBuffer浏览Store 方法的文档,它清楚地指出:

地址 [in]

类型:uint

以字节为单位的输入地址,必须是 4 的倍数

为了将正确的模式写入缓冲区,我必须能够将单个字节写入非对齐地址。在 OpenCL / CUDA 中,这是非常微不足道的。

  • 使用 HLSL 在技术上是否可以实现这一目标?
  • 这是一个已知的限制吗?可能的解决方法?
0 投票
0 回答
1193 浏览

c++ - “D3D12 错误:ID3D12Device::CreateComputePipelineState:根签名与计算着色器不匹配...”我的代码中的错误在哪里?

调试输出中的完整错误是:

“D3D12 错误:ID3D12Device::CreateComputePipelineState:根签名与计算着色器不匹配:着色器 SRV 描述符范围(RegisterSpace=0,NumDescriptors=1,BaseShaderRegister=0)未完全绑定在根签名中”

这表明我创建 SRV/将其绑定到根签名的方式存在问题,但我不确定我到底做错了什么。我将尝试在此处粘贴最低限度的必要代码:

...

...

...

...

顺便说一句,如果我注释掉所有特定于 SRV 的内容,这将毫无错误地运行。如果您需要我在此处发布其他内容以更好地诊断问题,我可以尝试提供。

编辑:着色器 DX Asm 的相关位:

0 投票
1 回答
332 浏览

c++ - “D3D12 损坏:ID3D12CommandList::CopyResource:pDstResource 已损坏。” 我是如何损坏着色器资源视图的缓冲区的?

标题中错误对应的调用代码为:

srvBuffer 是一个指向 ID3D12Resource 的智能指针。我与它的第一次真正互动是在这里:

之后我对 srvBuffer 什么都不做,直到尝试复制到它为止。这表明我必须在我的 CreateShaderResourceView 函数中至少犯了一个错误,我将其包括在此处:

我还检查了最终的 pDevice->CreateShaderResourceView 是否通过在此处放置断点来命中,并且确实如此。我希望有一个简单的答案。

编辑:我发现的一个问题是,在我尝试复制到 srvBuffer 之前,我的资源转换屏障出现另一个错误:“D3D12 错误:ID3D12CommandList::ResourceBarrier:指定了 NULL 指针。” 事实证明,this->srvBuffer.Get() 返回一个空指针,这表明我在 CreateCommittedResource 中失败了,我正在努力解决这个问题。不过,这个问题可能会解释最初的错误。

0 投票
1 回答
164 浏览

buffer - CPU读取GPU资源数据

这些天我正在学习directx11。我一直被困在计算着色器部分。

所以我做了四个资源和三个对应的视图。

  1. 不可变输入缓冲区 = {1,1,1,1,1} / SRV
  2. 不可变输入缓冲区 = {2,2,2,2,2} / SRV
  3. 输出缓冲器/无人机
  4. 用于读取的暂存缓冲区/无视图

我成功地创建了所有东西,并调度了 cs 函数,并将数据从输出缓冲区复制到暂存缓冲区,并读取/检查数据。

这是计算着色器代码

在 CS 中,它添加两个输入缓冲区数据并存储到输出缓冲区中。所以预期的答案是 {3,3,3,3,3}。

但结果是 {3,0,0,0,0} 只有第一个 idx 有正确的答案。

任何建议都会很棒。

0 投票
0 回答
117 浏览

unity3d - 计算着色器中的工作组执行顺序是否具有确定性和有序性?

我正在用 Unity 编写一个计算着色器。我了解工作组中的一组线程可以在硬件上以任何顺序/完全并行执行。我不确定的是一组工作组是否按特定顺序执行?

如果我的内核用 注释numthreads(256, 1, 1),这是否意味着SV_GroupID首先执行零,其线程SV_GroupIndex从 0 到 255(以任何顺序),然​​后是SV_GroupID数字 1,等等?

如果不是默认情况下,有没有办法强制执行它......?我可以将线程数设置为等于硬件上可用的数量,以确保它一次只能执行一组吗?(听起来很老套!)

上下文:我有一个稀疏的有序数据数组,我试图在保留顺序的同时将其压缩成一个密集的数组。事实证明,利用并行算法利用现有排序非常棘手!

0 投票
1 回答
2019 浏览

hlsl - 如何在 HLSL 中处理 8 位字符数据?

我正在将一些 OpenCL 代码转换为 DirectCompute,需要在计算着色器中处理 8 位字符串,但找不到“字节”或“字符”的 HLSL 数据类型。OpenCL 支持“char”类型,所以我期待一个等价的。定义和访问数据的最佳方式是什么?

似乎可以通过将数据视为一系列“uint”类型并通过位移、AND-ing 等对其进行解包来传递数据,但这似乎会导致不必要的开销。正确的方法是什么?

0 投票
1 回答
990 浏览

delphi - DirectX/DirectCompute CreateBuffer 失败,错误为 0x80070057 (E_INVALIDARG)

我正在尝试在 GPU 内存中创建一个缓冲区以从 CPU 上传数据。GPU 访问将是只读的。数据将用作计算着色器的输入缓冲区。

CreateBuffer() 失败并出现错误 0x80070057 (E_INVALIDARG)。我阅读了文档并再次阅读,但没有发现导致失败的参数。

InitDevice() 返回成功。

这是我的代码的摘录:

失败的代码如下:

调用该函数时,我传递 uElementSize=2、uCount=100 和 pInitData 指向 CPU 内存中分配的 200 字节缓冲区。

我不明白我做错了什么。任何帮助表示赞赏。

0 投票
1 回答
1123 浏览

c++ - DirectCompute CreateBuffer 失败并出现错误 0x80070057 (E_INVALIDARG)

我正在尝试在 GPU 内存中创建一个缓冲区以从 CPU 上传数据。GPU 访问将是只读的。数据将用作计算着色器的输入缓冲区。

CreateBuffer() 失败并出现错误 0x80070057 (E_INVALIDARG)。我阅读了文档并再次阅读,但没有发现导致失败的参数。

这是我标记失败的代码的摘录:

任何帮助表示赞赏。

0 投票
1 回答
497 浏览

c++ - DirectX/DirectCompute ByteAddressBuffer 初始化失败

我无法从我的 C++ 应用程序初始化 ByteAddressBuffer:每个 API 调用都成功,但在着色器中,数据始终为 0xFF。

为了创建和初始化 ByteAddressBuffer,我使用下面的函数。pInitData 指向包含 RGB 图像的缓冲区(uElementSize 为 3,uCount 为像素数)。

然后我创建一个着色器资源视图供计算着色器使用:

然后在 Render() 函数中,我将 SRV 传递给着色器:

在计算机着色器中,声明为:

输出是在屏幕上渲染的 texture2D。ByteAddressBuffer 的使用方式如下:

在显示器上,我只看到白色,而 RGB 值为 (226, 200, 170),即蓝天。

您可能需要查看完整代码,我准备了一个包含完整 MSVC2015 解决方案的 zip 文件。在此处下载:BIPApplication.zip

任何帮助表示赞赏。

0 投票
1 回答
279 浏览

c++ - 在 texture2D 中绘制线条和字符(DirectCompute HLSL 编程)

我进行了很多搜索,但没有找到如何让计算着色器在纹理 2D 中绘制线条和字符。

我的应用程序必须进行大量处理并在 texture2D 中生成位图,然后在屏幕上渲染并下载回 CPU 并最终保存在文件中。生成位图后,我必须绘制线条(和其他简单的几何形状)以及字符串来注释位图。我被困在了这个阶段。

顺便说一句:我正在使用 MSVC2015、DirectX/DirectCompute11、NVidia K4200 GPU。

任何帮助表示赞赏。