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

c# - Unity Compute Shaders 顶点索引错误

我有一个计算着色器和它附带的 C# 脚本,用于修改 y 轴上的顶点数组,简单到足以清晰。

但是尽管它运行良好,但着色器似乎忘记了我形状的第一个顶点(除非该形状是封闭体积?)

这是 C# 类:

我的计算机着色器脚本:

一开始我是从同一个缓冲区读取和写入,但由于遇到问题,我尝试使用单独的缓冲区,但没有成功。我仍然有同样的问题。

也许我误解了应该使用计算着色器的方式(我知道我可以使用顶点着色器,但我只想尝试计算着色器以进一步改进。)

为了完成我所说的,我想它与顶点在 Mesh.vertices 数组中的索引方式有关。

我尝试了很多不同的块/线程配置,但似乎没有解决问题组合尝试:

还有一些我不记得了。我认为最好的配置应该是具有良好平衡的东西,例如:

关于封闭体积:我不确定,因为对于 Cube {8 Vertices},一切似乎都相应地移动,但是对于具有奇数个顶点的形状,第一个(或最后一个尚未检查)似乎不被处理

我尝试了许多不同的形状,但细分平面是最明显的,一个角总是不动。

编辑 :

经过进一步研究,我发现它只是计算着色器不计算网格的最后(不是我检查的第一个)顶点,它似乎与缓冲区类型有关,我仍然不明白为什么 RWStructuredBuffer 应该是一个问题或我使用它有多糟糕,它是保留给流的吗?我无法理解关于这个的 MSDN 文档。

编辑:解决后

C# 脚本:

在您回答之前,我已经回滚到 Blocks VCount,1,1 因为这是我使用 VCount*VCount 的逻辑,因此处理顶点的次数比需要的“平方多”。

要完成,您是绝对正确的,Stride 显然给出了问题,您可以通过有关 stride 参数的文档链接来完成您的答案吗?(从任何地方,因为 Unity 文档是 VOID 并且 MSDN 没有帮助我理解为什么它应该是 12 而不是 32(因为我认为 32 是 float3 的大小)

所以请提供文档

与此同时,我将尝试提供一个足够灵活(通用?)的版本以使其更强大,并开始在我的着色器中添加一些不错的数组处理功能......

0 投票
1 回答
7536 浏览

unity3d - Unity Compute Shader,通过 SV_DispatchThreadID 进行数组索引

我在 Compute Shader 中的 GPU 上的数组索引存在问题,我已经坚持了好几个星期。

我正在尝试使用 SV_DispatchThreadID 的 x 值作为我的粒子数组的索引(如网络上的某些示例所示)。

它正在工作......但threadID变量(在主函数中)总是返回0,3,6,9,12,15......而不是0,1,2,3,4,......

我在 CPU 端的调度调用是: Dispatch(64, 1, 1);

我尝试了许多调度配置 (32,16,1), (128,1,1),... 有许多配置 numtards (1,1,1), (32,32,1), (16 ,16,1)...但总是相同的结果... threadID 从来没有被很好地排序。

如何获得有序索引?:(...总是得到像0,3,6,9这样的索引,...

有什么建议吗?

非常感谢。

这是我的 CS 内核和 C# 源代码:

用于创建 ComputeBuffer 和其他内容的 C# 代码:

这里是顶点、几何和像素着色器:

0 投票
0 回答
442 浏览

opengl - 为什么 imageStore 为整数 Sampler 写入的数据被解释为 Float?

我有以下计算着色器从 iimage2D 读取数据并根据其颜色值替换数据。我面临的问题是,尽管我以整数格式读取数据并以整数形式回写,但写入的数据被解释为 0 到 1 之间的浮点值。因此得到意外的输出。

以下是计算着色器:

}

0 投票
1 回答
1347 浏览

opengl - 计算着色器和 Cuda 之间的映射

我试图了解计算机着色器和 Cuda 之间的区别以及它们的操作方式。我只使用过 Cuda,据我了解:

在基于着色器的计算中,着色器的数量等于像素的数量,而在 Cuda 中,我们可以拥有对多个“像素数据元素”进行操作的内核线程。

在 Cuda 中,我们有各种内存类型,我们可以从中获取数据(全局、共享、常量、纹理),但在基于着色器的计算中会发生什么?是否有不同的内存类型以及计算如何映射到图形(内核、输入、输出)?在计算着色器中,进程之间没有通信是真的吗(如 Cuda 中的共享内存和同步)?计算着色器内核还有其他限制吗?

0 投票
1 回答
2163 浏览

c# - Unity C#体素有限水优化

我运行了一个(基本)体素引擎和一个看起来像这样(我假设基本上可以工作)的水系统:https ://www.youtube.com/watch?v=Q_TdeGIOOts (不是我的游戏)。
水值存储在一个 3d 浮点数组中,每 0.05 秒它通过检查下方和相邻的体素 (y-1, x-1, x+1, z-1, z+1) 来计算水流并添加价值。
该系统适用于少量水(70+ fps),但是当我开始计算 8+ 块的水时,它变得太多了。(我禁用了所有渲染或网格创建以检查这是否是瓶颈,它不是。它纯粹是流量计算)。
我不是一个很有经验的程序员,所以我不知道从哪里开始优化,除了像我已经做的那样在协程中进行计算。
在这篇文章中:https ://gamedev.stackexchange.com/questions/55414/how-to-define-areas-filled-with-water (靠近底部) Boreal 建议在计算着色器中运行它。这是我要走的路吗?我该怎么办?
任何帮助深表感谢。

0 投票
3 回答
820 浏览

c++ - 链接计算着色器

我尝试编译这个小 示例,但执行 make 时出现此错误:

我错过了什么?

0 投票
1 回答
5239 浏览

opengl - 在 OpenGL 中渲染数据:顶点和计算着色器

我希望能够在我的图形程序中输入一堆顶点,然后我希望能够对它们执行以下操作:

  • 在 OpenGL 的图形部分使用它们,尤其是在顶点着色器中。
  • 在计算着色器中对它们进行物理计算。

根据这些要求,我认为我需要一些结构来存储我的顶点并可以正确访问它们,我想到了以下几点:

  • 数组缓冲区
  • 纹理(用于存储信息,而不是用于纹理本身)

但是,我已经想到并提出了两种变体的缺点:

数组缓冲区:

  • 我不确定我的计算着色器如何读取,更不用说修改顶点了。但我确实知道如何画它们。

纹理:

  • 我知道如何在计算着色器中修改它们,但是我不确定如何从纹理中绘制。更具体地说,需要绘制的元素数量取决于纹理中写入(数据非零)元素的数量。

我可能忽略了一些满足我需要的重要其他功能,所以真正的问题是:
如何创建驻留在 GPU 上的顶点,并且我可以在顶点和计算着色器中访问它们?

0 投票
2 回答
10520 浏览

c# - 计算着色器输入 3d 浮点数组

编写要在 Unity 4 中使用的计算着色器。我正在尝试获得 3d 噪声。

目标是从我的 C# 代码中将一个多维 float3 数组放入我的计算着色器中。这是否可能以直接的方式(使用某种声明)或只能使用 Texture3D 对象来实现?

我目前有一个在单个 float3 点上工作的单纯形噪声的实现,输出单个浮点数 -1 到 1。我移植了此处为计算着色器找到的代码。

我想通过对数组中的Vector3[,,]每个 float3 点应用噪声操作来扩展它以处理 float3 的 3D 数组(我想 C# 中最接近的比较是 )。

我尝试了其他一些方法,但它们感觉很奇怪并且完全错过了使用并行方法的意义。以上是我想象的应该是什么样子。

我还设法让Scrawk 的实现作为顶点着色器工作。Srawk 使用 Texture3D 将 3D float4 数组放入着色器。但我无法从纹理中提取浮动。计算着色器也是这样工作的吗?依赖纹理?我可能忽略了一些关于从纹理中获取值的问题。这似乎是该用户在这篇文章中获取数据的方式。与我的类似问题,但不是我想要的。

一般来说,着色器是新手,我觉得我错过了一些关于计算着色器及其工作原理的非常基本的东西。目标是(我相信您已经猜到了)使用 Compute Shaders(或任何最适合此类工作的着色器)使用行进立方体在 GPU 上生成噪声和网格计算。

约束是 Unity 4 的免费试用版。

这是我正在使用的 C# 代码的骨架:

这是计算着色器

0 投票
1 回答
1005 浏览

opengl - OpenGL 计算着色器扩展

我在创建计算着色器时遇到问题。

我的程序似乎不知道GLenum type GL_COMPUTE_SHADER我何时尝试使用glCreateShader() func.

我的显卡有点低端,但是当我检查GL_ARB_compute_shader扩展时它存在,所以我猜这应该不是问题。

我必须做些什么来启用这个扩展,还是有其他问题我必须使用 OpenCL?

0 投票
0 回答
396 浏览

opengl - opengl中瓷砖的最小/最大深度

我正在尝试实现平铺延迟渲染,但我坚持计算每个平铺的最小/最大深度。我为此使用计算着色器。这是它的完整代码:

当我尝试运行程序时,它会在计算着色器编译中无限循环。知道为什么会出现这种情况以及如何解决吗?

编辑:所以当我尝试检查我正在使用此代码执行的计算着色器的链接状态时,我发现问题是由glGetProgramiv()函数引起的:

但是,如果我从我的着色器中删除atomicMin()一切正常。