问题标签 [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 回答
1431 浏览

c++ - 平铺渲染计算着色器灯光剔除和着色

我正在尝试在 OpenGL/GLSL 中实现平铺延迟渲染,但我被困在灯光剔除上。

我的 GPU 有点旧(AMD Radeon 6490m),由于奇怪的原因,当在共享变量上调用原子操作时,计算着色器以无限循环运行,因此我无法使用计算着色器计算最小和最大深度。无论如何,这不是很耗时的操作,所以我在片段着色器中进行。

然后对于每个可见点光(在视图空间中),我计算屏幕空间边界四边形。现在我想使用单个计算着色器进行灯光剔除和着色。问题是,如上所述,我无法对共享变量使用原子操作,因此我无法构建平铺灯光列表并存储平铺的灯光计数。

问题是我找不到任何其他方法来做到这一点。知道如何使用非原子来剔除和构建平铺灯列表吗?

这是我的计算着色器的伪代码:

0 投票
0 回答
717 浏览

c++ - 如何将计算着色器功能添加到针对 dx11 硬件的 dx9 应用程序

我正在使用无法更新到 dx11 的 dx9 应用程序。

我有一些我想移植到这个应用程序的计算着色器,但我不知道我可以使用什么来直接写入 dx9 纹理和可能的缓冲区(它是实时图形,因此处理数据是不可接受的)。

它必须在 Intel 、 Amd 和 Nvidia gpus 上工作(所有 dx11 都准备好了),所以 CUDA 不是一个选项。

我不知道你是否可以在dx11和dx9设备之间共享资源,但它会解决我所有的问题。实际场景是从dx9中获取一个rendertarget并共享它。在 dx 11 中获取它,通过计算着色器对其进行处理,并将内容写入共享的 dx11 纹理中,我可以在 dx9 中绑定以进行渲染。

当我在线阅读一些 dx9 互操作时,我也倾向于 opencl。

我尝试下载 Amd app sdk,但在文档中我没有找到对 dx9 互操作的任何引用(关于 dx10 的一些话,但所有文档都集中在 opengl 互操作)。我没有检查其他供应商的 opencl sdk。

c++ amp 似乎也不适用于 dx9。

如果我不能使用 Dx11<->Dx9 共享资源的东西,你知道这是否可行,如果可以的话,什么 gpgpu 解决方案可以完成这项工作?

0 投票
1 回答
11555 浏览

canvas - 如何使用 HTML5 画布作为 WebGL 纹理

我想要:

  1. 为案例 i 设置统一值。
  2. 将案例 i 的计算着色器渲染到 HTML5<canvas>标记。
  3. 在下一个渲染过程中使用<canvas>内容(我渲染输出的情况)作为纹理。
  4. 对所有情况重复。
  5. 从颜色数据中提取答案到 JS 中。

我正在尝试制作一个计算着色器,并且需要在每个渲染过程中为每个像素(片段)携带一个值。一个简单的例子是在每次渲染调用时增加一个像素的蓝色值。

IE

  1. 这种着色器循环甚至可能吗?

  2. 是否有更好的方法可以在视频内存中保留“携带”纹理以进行多通道处理(与标准的着色器内多通道处理不同,在通道之间必须更改统一值)?

0 投票
1 回答
1002 浏览

opengl - 无法使用 gimage2D 访问 GLSL 计算着色器中的 fbo 附加纹理

我最近想为 OpenGL 开发一个计算着色器。在这个实验中,我想访问一个附加到 FrameBufferObject 的颜色纹理。当尝试使用 layout(rgba32f) 只读 image2D 将纹理传递给计算着色器时,没有传入任何内容。我重写了计算着色器以改用 sampler2D。采样器工作得很好。

我还测试了只使用纹理的 gimage2D 计算着色器,它没有附加到任何东西上。这也按预期工作。

我还没有找到任何说明无法在使用 gimage2D 的计算着色器中访问附加到 FBO 的纹理的文档。我也没有找到任何说明计算着色器无法写入 FBO 的文档。

我想我的问题是为什么不能在计算着色器中使用 gimage2D 访问附加到 FBO 的纹理?有文件解释这个吗?

0 投票
0 回答
1233 浏览

opengl - opengl 4.3计算着色器不将值写入缓冲区

我在计算着色器方面遇到了一个奇怪的问题,因为我更改了传递给着色器的缓冲区的结构大小。

像这样定义的。我在尝试使用扁平 id 时遇到问题,所以我想将 id 写回我传入的缓冲区。着色器看起来像这样。

所以到目前为止一切都很好,但是当我取消注释最后一行是particleBuffer.particles [4]的那一刻,网格从屏幕上消失了。我之前已经设法改变了这个网格的位置数据,但这看起来很奇怪。我验证了我确实有 16 个我要传入的缓冲区元素,因此它也不应该超出范围(即,cloth1.particles.size() = 16)。有任何想法吗 ??整个代码在这里.. https://github.com/ssarangi/OpenGL_Cloth/tree/master/cloth_4_3_compute

***********************已编辑安东的评论*********************** ******* 这是 C++ 方面的新布局。

GLSL 端定义。我不确定的是填充元素是否需要包含在 glsl 结构中。它仍然没有更新ID。

0 投票
1 回答
5321 浏览

hlsl - 了解 ComputeShaders 中的“采样器数组索引必须是文字表达式”错误

假设我有一个计算着色器,它使用组的 ID 从 Texture2DArray 检索数据,如下所示:

假设我像这样启动它deviceContext->Dispatch(2, 0, 0);

因此,2 组,每组 32 个线程从 Texture2DArray 读取像素值。GroupID.x = 0 中的所有线程将从 gTextureArray[0] 中读取值,而 GroupID.y = 0 中的所有线程将从 gTextureArray[1] 中读取值。事实证明我无法编译那个简单的代码,而是得到了这个编译错误error X3512: sampler array index must be a literal expression

现在,我知道我可以这样做:

或者使用一个开关,以防我有很多组,所以它看起来不那么糟糕(它仍然如此)

请注意没有扭曲分歧,因为每组中的所有线程都将进入一个分支或另一个分支。我的问题是,我在这里错过了什么吗?为什么 HLSL 不支持这种索引,因为我看不到任何分歧或其他问题,至少在这种情况下?

0 投票
1 回答
3039 浏览

c++ - 计算着色器 - 如何全局同步线程?

编辑:我重新表述了这个问题,使其更通用并简化了代码。

我可能在计算着色器中缺少线程同步的一些东西。我有一个简单的计算着色器,可以并行减少一些数字,然后我需要修改最终总和:

减少工作并产生正确的结果。如果我注释最后一个条件,那么里面的值clusters[0].size是262144,这是正确的(它是线程数)。如果我取消注释它,我希望得到值 23,因为据我了解,之后的线程barrier()应该是同步的,并且之前memoryBarrier()所有的内存更改都应该是可见的。但是它不起作用,它会产生类似 259095 的结果。我猜值 23 是由先前atomicAdd从另一个线程重写的,但我不明白为什么。

这就是我在 CPU 上读取结果的方式:

我有 NVIDIA GT630M 卡和带有 nvidia 专有驱动程序(331.49)的 linux。

0 投票
2 回答
2114 浏览

opengl-es - 一个片段可以访问 WebGL GLSL 中的所有纹理像素值吗?(不仅仅是它自己的 TexCoord)

假设我正在使用 WebGL 和 GLSL 制作计算着色器。

在这个着色器中,每个片段(或像素)都想查看纹理上的每个像素,然后决定它自己的颜色。

通常一个片段采样它从几个纹理中提供纹理坐标(UV 值),但我想有效地从单个纹理中为单个片段采样所有 UV 值。

这可能吗?

0 投票
1 回答
987 浏览

opengl - GLSL - 使用部分着色器存储缓冲区作为计数器的正确性

这个问题是这个主题的延续: 如何正确绑定数千个缓冲区

这个问题与粒子模拟课题有关。假设我需要一个全局结构,其中包括:

  1. 一个 3D 矩阵 (32*32*32) 的 uints(保存散列链表的标头 id)。
  2. 一个计数器,告诉我散列链表中的粒子数量。
  3. 散列的粒子链表。

第一个想法是为第一项使用 3D 纹理,第二项使用原子计数器缓冲区,第三项使用 SSB。

SSB 中的每个条目都是一个粒子加上一个 uint,其值指向同一体素中下一个粒子的位置。

这里没有什么神奇的。

现在,为了独立于空间(不绑定到唯一的立方空间),我必须能够将粒子从立方体传递到它周围的其他物体。由于我在 3D 空间中,27 个立方体(正面)作为物理计算的输入变量,还有 27 个立方体(背面)作为输出,因为我可以将一个粒子从一个立方体(正面)写入另一个(背面)覆盖空间的不同部分。

这导致我需要绑定 54 个纹理、54 个 SSB 和 54 个原子计数器。虽然这两个第一个可能不是问题(我的硬件限制都在 90 左右),但 ACB 绑定限制是 8。

假设有一个单独的 ACB 包含每个立方体的粒子数并不容易维护(我没有考虑很长时间,这可能是解决方案,但这不是这里的问题)。

语境 :

SSB 可以包含任何内容。因此,一种解决方案是将三个结构(标题矩阵、计数器和链表)连接到一个 SSB 中,这将是我的立方体超结构。

我需要在每次通过之前知道 SSB 中有多少粒子来执行正确的 glDispatchCompute​() 调用。

问题 :

绑定 SSB 只是为了读取包含粒子数量的 uint 会不会很糟糕?

如果不是,那么访问计数的两种方法中的一种是否比另一种更好?为什么 ?

如果没有,有没有好的方法或者我应该将计数器与 SSB 分开?

0 投票
0 回答
492 浏览

opencl - Pixel Bender 的替代品?

现在废弃的 Pixel Bender 有替代品吗?一个框架,我可以专注于编写核心逻辑的脚本,而不必担心图像 I/O、GUI 或低级着色器代码。基于 GPU 的解决方案将是最好的,因为我想用它来计算繁重的任务,比如 CPU 太慢的距离场生成。