问题标签 [compute-shader]

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

directx - 与计算着色器和 Direct2D 互操作?

我正在开发一个集成 WPF 和 DirectX 的应用程序。我的目标是拥有一个共享表面,用于:

  1. 加载初始图像数据。
  2. 运行 DirectX 11 Compute Shaders 进行一些图像处理。
  3. 使用 Direct2D 在顶部绘图。
  4. 在我的 WPF 应用程序中显示结果。

我想我已经弄清楚了 1、3 和 4,但是 2 让我很头疼。我的基本问题归结为:我认为共享表面格式必须B8G8R8A8_UNorm用于 WPF 和 Direct2D 互操作,但我无法在该类型的纹理上为我的计算着色器创建无序访问视图。

我该怎么做才能让计算着色器在这种情况下工作?我是否错过了一些创建无人机的棘手方法?我是否需要重组我的应用程序以某种方式使用多个纹理?

0 投票
2 回答
1031 浏览

c++ - DX11 动态大小的缓冲区

我正在尝试为大学项目制作可变形的体素地形。我目前正在使用数字 3DTextures 将我的体素数据保存在“块”中。我的计划是使用计算着色器对所述体素数据执行行进立方体算法,并将顶点输出到缓冲区中,然后每帧都可以渲染该缓冲区。

问题是,为了为我正在使用的结构化缓冲区设置 UAV,我需要知道 D3D11_BUFFER_UAV 的 NumElements 有多少元素。我可以猜测它可能包含的最大值,但是在计算着色器完成之前我无法知道它实际上会包含多少,并且我想到这可能不是解决问题的最佳方法.

我真正需要做的就是让计算着色器输出任意数量的顶点,这些顶点可以在以后存储和渲染,关于最好的方法有什么想法吗?

0 投票
2 回答
30983 浏览

opengl - OpenCL 和 OpenGL 的计算着色器有什么区别?

我知道 OpenCL 可以控制 GPU 的内存架构,因此可以进行更好的优化,但是,抛开这一点,我们可以使用计算着色器进行矢量运算(加法、乘法、求逆等)吗?

0 投票
1 回答
150 浏览

c++ - 为什么 Dispatches 连续开始需要不同的时间?

我有这个程序:

第一次迭代仅持续 26 毫秒,而第二次 46 毫秒?

以防万一着色器:

但我不认为每次开始都需要不同的时间。

有趣的是,如果我注释掉 ''if (i == STEPS / 2)'' 行,两半花费几乎相同的时间。

编辑:据我目前所见,这是因为兑现

0 投票
1 回答
2635 浏览

directx - DirectX 计算着色器是否支持共享内存中的二维数组?

我想groupshared在 DirectX 计算着色器中使用内存来减少全局内存带宽并希望提高性能。我的输入数据是 a Texture2D,我可以使用 2D 索引访问它,如下所示:

我想有一个共享内存的二维数组来缓存输入数据的一部分,所以我尝试了明显的:

它不会编译。错误消息说syntax error: unexpected token ','

有没有办法拥有一个二维共享内存数组?如果不是,那么处理存储在 1D 共享内存数组中的 2D 数据的好技术是什么?

0 投票
1 回答
3308 浏览

directx - 计算着色器:从另一个线程中读取写入的数据?

有人可以告诉我 DirectX 11 是否可以使用以下计算着色器?

我希望 Dispatch 中的第一个线程访问缓冲区(g_positionsGrid)中的元素,以使用临时值设置(比较交换)该元素,以表示它正在采取一些行动。

在这种情况下,临时值为 0xffffffff,第一个线程将继续并从结构化附加缓冲区(g_positions)分配一个值并将其分配给该元素。

所以到目前为止一切都很好,但是调度中的其他线程可以进入比较交换和第一个线程的分配之间,因此需要等到分配索引可用。我这样做是忙着等待,即while循环。

然而遗憾的是,这只是锁定了 GPU,因为我假设第一个线程写入的值不会传播到卡在 while 循环中的其他线程。

有没有办法让这些线程看到那个值?

谢谢你的帮助!

0 投票
1 回答
1590 浏览

graphics - 跨多个着色器使用的无人机计数器索引?

我一直在尝试实现基于计算着色器的粒子系统。

我有一个计算着色器,它使用带有 D3D11_BUFFER_UAV_FLAG_COUNTER 标志的 UAV 构建粒子的结构化缓冲区。

当我添加到这个缓冲区时,我会检查这个粒子是否有任何复杂的行为,我想过滤掉这些行为并在单独的计算着色器中执行。例如,如果粒子想要执行碰撞检测,我将其索引添加到另一个结构化缓冲区,也带有 D3D11_BUFFER_UAV_FLAG_COUNTER 标志。

然后我运行第二个计算着色器,它处理所有索引,并对这些粒子应用碰撞检测。

然而,在第二个计算着色器中,我估计大约 5% 的索引是错误的——它们属于不支持碰撞检测的其他粒子。

这是执行列表构建的计算着色器代码:

如果我将“添加到行为列表”位拆分为单独的计算着色器,并在粒子列表构建后运行它,一切都会完美运行。但是我认为我不应该这样做 - 再次通过所有粒子是浪费带宽。

我怀疑IncrementCounter实际上并不能保证将唯一索引返回到 UAV,并且正在进行一些巧妙的优化,这意味着该索引仅在使用它的计算着色器内有效。因此我尝试将它传递给第二个计算着色器无效。

任何人都可以对这里发生的事情给出任何具体的答案吗?如果有办法让我将过滤保持在与我的核心更新相同的计算着色器中?

谢谢!

0 投票
1 回答
484 浏览

wpf - 使用着色器进行长时间计算而不会导致延迟

我正在尝试将 Compute Shader 与 DirectX 11 一起使用来进行一些简单但昂贵的计算(想想 Mandelbrot Set)。计算结果放置在纹理上并且不重叠。它不是实时的,因为预计需要 1 到 10 秒,但它会在完成后立即显示在 UI 上。

我通过http://directx4wpf.codeplex.com/使用 WPF 和 SharpDX 。该库有一个带有 RenderScene 函数的 DX11 视图对象,其中调用 DX 渲染函数(包括计算机着色器)并在主线程中运行,据我了解,它被尽可能频繁地调用(将尝试最大化 FPS )。显然,坚持使用计算机着色器是没有选择的,因为如果它也使用 GPU,它将阻塞主线程以及 UI 的其余部分,甚至操作系统的其余部分。

问题是,我应该如何执行这些计算而不会导致应用程序其余部分的 UI 出现任何延迟

如果这纯粹是在 CPU 上运行,我只会运行一个单独的线程。但是,根据我对 GPU 的基本了解,我目前的印象是 GPU 不太适合调度/上下文切换。因此,即使我在另一个线程上运行计算(在 DX11 中使用延迟渲染),计算仍然会阻塞 GPU,直到它完成。那是对的吗?

我试图将计算着色器的工作拆分成更小的部分(大约 8000 个线程)。这是可行的,没有底层几何体,我每次调用计算着色器时都可以添加一个偏移量。这实际上不起作用,因为开销很大。事实上,将工作分成 N 块(通过连续调用计算着色器 N 次)似乎会导致线性减速 N 倍。我不确定这是否是因为上面链接的 WPF 库 SharpDX ,或者只是关于使用 GPU 的一个不可避免的事实。

任何人都有关于如何在这种情况下进行的建议,也许是做类似事情的示例项目,或者可能是阅读的好资源?我在做任何错误的假设吗?

0 投票
1 回答
1596 浏览

opengl - 使用着色器存储对象绘制不工作

对于要渲染的所有对象,我使用 glDrawElements。然而,我对 Compute Shaders 的冒险给我留下了一个使用 glDrawArrays 的设置。与许多违反该主题的人一样,我使用此PDF作为基础。问题是当它被渲染时,什么都没有出现。

标头包含所需的结构和其他变量,因此它们不会超出特定对象的范围。

这是计算着色器本身。

出于测试目的,我降低了重力。我相信没有什么是超出范围的,也没有必要的绑定,但它暗示了我为什么粒子没有绘制。此外,我还添加了一个几何着色器,它围绕每个点构建一个四边形,但它没有解决任何问题。

0 投票
1 回答
771 浏览

synchronization - 一次调用可以在 glsl 计算着色器中进行乒乓传播吗?

我尝试使用 glsl 计算着色器实现 32x32x32 3D 纹理的传播方案,如果我可以只执行一次着色器来进行 x 次迭代,那就太好了。

我有 3 个纹理,一个是源,一个是目标,第三个是所有东西。每次迭代都必须交换源和目标。伪代码看起来像 OpenGL:

GLSL:

问题是由于纹理的大小,我无法在一个工作组中完成所有这些工作。它会在一个工作组中,我可以使用 barrier() 就可以了。由于纹理的交换,我需要在从下一次迭代再次读取之前更新所有值。有人知道这是否可能吗?

谢谢马克