问题标签 [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.
direct3d - 是否可以使用 HLSL 计算着色器写入非 4 字节对齐的地址?
我正在尝试将现有的 OpenCL 内核转换为 HLSL 计算着色器。
OpenCL 内核对 RGBA 纹理中的每个像素进行采样,并将每个颜色通道写入一个紧密封装的数组。
uchar
所以基本上,我需要以类似于这样的模式写入一个紧凑的数组:
其中每个字母代表源自像素通道的单个字节(红色/绿色/蓝色/阿尔法)。
RWByteAddressBuffer
浏览Store 方法的文档,它清楚地指出:
地址 [in]
类型:uint
以字节为单位的输入地址,必须是 4 的倍数。
为了将正确的模式写入缓冲区,我必须能够将单个字节写入非对齐地址。在 OpenCL / CUDA 中,这是非常微不足道的。
- 使用 HLSL 在技术上是否可以实现这一目标?
- 这是一个已知的限制吗?可能的解决方法?
c++ - “D3D12 错误:ID3D12Device::CreateComputePipelineState:根签名与计算着色器不匹配...”我的代码中的错误在哪里?
调试输出中的完整错误是:
“D3D12 错误:ID3D12Device::CreateComputePipelineState:根签名与计算着色器不匹配:着色器 SRV 描述符范围(RegisterSpace=0,NumDescriptors=1,BaseShaderRegister=0)未完全绑定在根签名中”
这表明我创建 SRV/将其绑定到根签名的方式存在问题,但我不确定我到底做错了什么。我将尝试在此处粘贴最低限度的必要代码:
...
...
...
...
顺便说一句,如果我注释掉所有特定于 SRV 的内容,这将毫无错误地运行。如果您需要我在此处发布其他内容以更好地诊断问题,我可以尝试提供。
编辑:着色器 DX Asm 的相关位:
c++ - “D3D12 损坏:ID3D12CommandList::CopyResource:pDstResource 已损坏。” 我是如何损坏着色器资源视图的缓冲区的?
标题中错误对应的调用代码为:
srvBuffer 是一个指向 ID3D12Resource 的智能指针。我与它的第一次真正互动是在这里:
之后我对 srvBuffer 什么都不做,直到尝试复制到它为止。这表明我必须在我的 CreateShaderResourceView 函数中至少犯了一个错误,我将其包括在此处:
我还检查了最终的 pDevice->CreateShaderResourceView 是否通过在此处放置断点来命中,并且确实如此。我希望有一个简单的答案。
编辑:我发现的一个问题是,在我尝试复制到 srvBuffer 之前,我的资源转换屏障出现另一个错误:“D3D12 错误:ID3D12CommandList::ResourceBarrier:指定了 NULL 指针。” 事实证明,this->srvBuffer.Get() 返回一个空指针,这表明我在 CreateCommittedResource 中失败了,我正在努力解决这个问题。不过,这个问题可能会解释最初的错误。
buffer - CPU读取GPU资源数据
这些天我正在学习directx11。我一直被困在计算着色器部分。
所以我做了四个资源和三个对应的视图。
- 不可变输入缓冲区 = {1,1,1,1,1} / SRV
- 不可变输入缓冲区 = {2,2,2,2,2} / SRV
- 输出缓冲器/无人机
- 用于读取的暂存缓冲区/无视图
我成功地创建了所有东西,并调度了 cs 函数,并将数据从输出缓冲区复制到暂存缓冲区,并读取/检查数据。
这是计算着色器代码
在 CS 中,它添加两个输入缓冲区数据并存储到输出缓冲区中。所以预期的答案是 {3,3,3,3,3}。
但结果是 {3,0,0,0,0} 只有第一个 idx 有正确的答案。
任何建议都会很棒。
unity3d - 计算着色器中的工作组执行顺序是否具有确定性和有序性?
我正在用 Unity 编写一个计算着色器。我了解工作组中的一组线程可以在硬件上以任何顺序/完全并行执行。我不确定的是一组工作组是否按特定顺序执行?
如果我的内核用 注释numthreads(256, 1, 1)
,这是否意味着SV_GroupID
首先执行零,其线程SV_GroupIndex
从 0 到 255(以任何顺序),然后是SV_GroupID
数字 1,等等?
如果不是默认情况下,有没有办法强制执行它......?我可以将线程数设置为等于硬件上可用的数量,以确保它一次只能执行一组吗?(听起来很老套!)
上下文:我有一个稀疏的有序数据数组,我试图在保留顺序的同时将其压缩成一个密集的数组。事实证明,利用并行算法利用现有排序非常棘手!
hlsl - 如何在 HLSL 中处理 8 位字符数据?
我正在将一些 OpenCL 代码转换为 DirectCompute,需要在计算着色器中处理 8 位字符串,但找不到“字节”或“字符”的 HLSL 数据类型。OpenCL 支持“char”类型,所以我期待一个等价的。定义和访问数据的最佳方式是什么?
似乎可以通过将数据视为一系列“uint”类型并通过位移、AND-ing 等对其进行解包来传递数据,但这似乎会导致不必要的开销。正确的方法是什么?
delphi - DirectX/DirectCompute CreateBuffer 失败,错误为 0x80070057 (E_INVALIDARG)
我正在尝试在 GPU 内存中创建一个缓冲区以从 CPU 上传数据。GPU 访问将是只读的。数据将用作计算着色器的输入缓冲区。
CreateBuffer() 失败并出现错误 0x80070057 (E_INVALIDARG)。我阅读了文档并再次阅读,但没有发现导致失败的参数。
InitDevice() 返回成功。
这是我的代码的摘录:
失败的代码如下:
调用该函数时,我传递 uElementSize=2、uCount=100 和 pInitData 指向 CPU 内存中分配的 200 字节缓冲区。
我不明白我做错了什么。任何帮助表示赞赏。
c++ - DirectCompute CreateBuffer 失败并出现错误 0x80070057 (E_INVALIDARG)
我正在尝试在 GPU 内存中创建一个缓冲区以从 CPU 上传数据。GPU 访问将是只读的。数据将用作计算着色器的输入缓冲区。
CreateBuffer() 失败并出现错误 0x80070057 (E_INVALIDARG)。我阅读了文档并再次阅读,但没有发现导致失败的参数。
这是我标记失败的代码的摘录:
任何帮助表示赞赏。
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
任何帮助表示赞赏。
c++ - 在 texture2D 中绘制线条和字符(DirectCompute HLSL 编程)
我进行了很多搜索,但没有找到如何让计算着色器在纹理 2D 中绘制线条和字符。
我的应用程序必须进行大量处理并在 texture2D 中生成位图,然后在屏幕上渲染并下载回 CPU 并最终保存在文件中。生成位图后,我必须绘制线条(和其他简单的几何形状)以及字符串来注释位图。我被困在了这个阶段。
顺便说一句:我正在使用 MSVC2015、DirectX/DirectCompute11、NVidia K4200 GPU。
任何帮助表示赞赏。