问题标签 [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 投票
0 回答
155 浏览

opengl - 计算着色器:纹理初始化错误

我的计算着色器中有一个 image2DArray,有 7 个切片。我可以毫无问题地使用函数 imageStore 在其中写入并显示这些纹理。

我的问题与初始化有关,我尝试初始化我的纹理,但我不能。事实上,我为初始化做了一个循环:

当 N = 7 时,不显示任何内容,但当 N < 7 时一切正常并且我的纹理已初始化。

有人可以解释为什么我无法正确初始化我的 image2DArray 吗?

编辑:我测试看到的是:尝试写入纹理的所有切片并显示它。它工作正常,但如果我不初始化纹理,前一帧的数据会保留。因此,我将切片的所有像素初始化为 0,但如果 N=7,则不再显示任何内容。

一些代码:

0 投票
1 回答
8246 浏览

opengl - 将 SSBO 绑定到片段着色器

我有一个 SSBO,它存储屏幕上每个像素的 vec4 颜色值,并在主循环之前由计算着色器预先填充了值。

我现在正试图在屏幕上获取这些数据,我猜这涉及使用片段着色器(尽管如果你知道更好的方法,我愿意接受建议)

所以我试图将缓冲区或至少其中的数据获取到片段着色器,以便我可以将每个片段的颜色设置为缓冲区中的相应值,但我找不到任何这样做的方法?

有人告诉我可以将 SSBO 绑定到片段着色器,但我不知道该怎么做?我的其他想法是以某种方式将数据从 SSBO 移动到纹理,但我也无法解决

更新:

作为回应 thokra 的出色回答和以下评论是设置我的缓冲区的代码:

然后我调用计算着色器,这部分工作,我检查数据是否已正确填充。然后在我的片段着色器中,作为一个测试:

我注意到的是,指数越高,它似乎需要的时间越来越长,所以在 660000 它实际上并没有崩溃,它只是花费了很长的时间。

0 投票
0 回答
379 浏览

c++ - 将纹理与计算和片段着色器一起使用

我正在尝试使用纹理来存储一些数据,以便在计算数据的计算着色器和使用它的片段着色器之间传递。

我创建纹理并使用空值填充它:

然后,我使用以下命令将其提供给计算着色器:

这是此函数的规范,因此您可以检查我是否使用了正确的参数:https ://www.opengl.org/sdk/docs/man/html/glBindImageTexture.xhtml

然后在计算着色器中,我使用以下方法获取纹理:

然后我将纹理的值之一设置为测试:

这应该将该 vec4 放入位置 (0,0) 的纹理中。

然后将纹理添加为片段着色器所属程序的统一:

然后在片段着色器中我得到了纹理:

并尝试将某些颜色设置为纹理中位置 (0,0) 的值:

但是结果我只是变黑了:即(0.0、0.0、0.0、1.0)。无论我在计算着色器中设置什么,我总是得到这个。

我可能遗漏了一些非常明显的东西,所以一些显示我遗漏的代码会很棒

0 投票
1 回答
134 浏览

opengl - Writing to a GL_TEXTURE_3D

I have a GL_TEXTURE_3D of size 16x16x6 and I write to it in a compute shader, however I can only seem to write to the values where z=0. If I attempt to call imageStore with any coordinate where z!=0 the value doesn't appear in the texture.

What could be causing this problem?

0 投票
0 回答
835 浏览

opengl - 在片段着色器中采样 GL_TEXTURE_3D

我有一个大小为 16x16x6 的 GL_TEXTURE_3D,它已在计算着色器中填充了浮点数,我正在尝试在片段着色器中对其进行采样。

为了使其可用于片段着色器,我在绘制调用之前有以下代码:

然后在片段着色器本身:

然后测试纹理是否正确通过:

基于此,看起来每个纹素值都是(0.0,0.0,0.0,1.0)

我想不通这是为什么?我希望坐标(0,0,0)值是(16.0,0.0,0.0,0.0)或者(16.0,16.0,16.0,16.0)基于我在计算着色器中设置的值

PS 可能值得注意的是,这些值被正确写入纹理我检查计算和片段着色器调用之间使用glGetTexImage()

0 投票
0 回答
652 浏览

c++ - 计算着色器中的原子操作对性能有何影响?

我有一个计算着色器,它可以修改 256x256 纹理中的纹素。

计算着色器有 256x256x256 次调用,其中调用的 x 和 y 分量直接映射到 texel 的 u 和 v 坐标。所以每个 texel 可以被写入 256 次。

我希望计算着色器的每次调用都检查给定纹素中当前的内容并执行一些测试来决定是否覆盖它。然而,为了避免在任何其他调用写入之前它们都获得纹素值的并发问题,我希望使用原子操作将值写入纹理。

但是我被告知,这破坏了并行化操作的意义,因为原子操作迫使其他一切都等到它完成,这意味着计算着色器的每个 z 调用都必须按顺序进行,因为它们等待前一个原子地写入纹理。

是这样吗?如果是这样,这会对性能产生多大影响?值得注意的是 z 调用可以改变并且可能比 256 多很多

0 投票
0 回答
235 浏览

opengl - 计算着色器只更新部分数据

我坚持使用我的程序渲染所有粒子,但只在 3 上更新 1 个粒子。这是我为测试它所做的工作。我用我的 10 个粒子制作了一个 vbo,将它们全部对齐并设置计算着色器以在每次更新时修改它们的 x 位置(pos.x+=0.1)。这是大约 1-2 秒后的结果(图像为 1:5 比例):

例子

我使用 local_size_x = 1, local_size_y = 1 和 local_size_z = 1,然后是 DispatchCompute(10,1,1) 。我对调用 ID 做错了吗?

更新

通过添加填充在着色器中使用结构定义使其每次更新仅跳过一个数据。这意味着这是一个填充问题,但我找不到关于如何正确填充的任何好的解释。另外,可以不垫吗?如果我不想要所有这些额外的、无用的数据怎么办?

0 投票
0 回答
138 浏览

opengl - OpenGL - 将着色器存储缓冲区对象绘制到屏幕

在我的计算机着色器中,我正在用 ARGB 值填充我的 SBBO。(不过,我可以轻松地将其更改为 RGBA)。但现在我想将我填充的缓冲区绘制到屏幕上。

最好的方法是什么,你能举个例子吗?

0 投票
1 回答
9505 浏览

opengl - 计算着色器写入纹理

我已经实现了将投影纹理复制到 3d 对象上的更大纹理的 CPU 代码,如果你愿意的话,“贴花烘焙”,但现在我需要在 GPU 上实现它。为此,我希望使用计算着色器,因为在我当前的设置中添加 FBO 非常困难。

我当前实现的示例图像

这个问题更多是关于如何使用计算着色器,但对于任何有兴趣的人来说,这个想法是基于我从用户 jozxyqk 那里得到的答案,在这里看到:https ://stackoverflow.com/a/27124029/2579996

写入的纹理在我的代码中称为_texture,而投影的纹理是_textureProj

简单的计算着色器

如您所见,我目前只想将纹理更新为任意(蓝色)颜色。

更新功能

问题 如果我调用updateTex()主程序对象的外部,我会看到效果,而如果我在其范围内调用它,如下所示:

然后在渲染我看到这个:

问题: 我意识到在主程序对象范围内设置更新方法不是正确的方法,但它是获得任何视觉结果的唯一方法。在我看来,发生的事情是它几乎消除了片段着色器并绘制到屏幕空间......

我该怎么做才能使它正常工作?(我的主要重点是能够将任何内容写入纹理和更新)

如果需要发布更多代码,请告诉我。

0 投票
1 回答
533 浏览

opengl - Vncviewer 中的 OpenGL 着色器异常

Ubuntu 12.04 64bit我通过应用程序连接遥控器vncviewer。但是当我运行一个OpenGL应用程序时,它会显示异常信息:

但是,如果我将显示器与远程计算机连接起来,它就可以正常工作并且可以显示OpenGL应用程序。

是否有任何解决方案可以使OpenGL应用程序在远程窗口中运行vncviewer?谢谢!

更新:

在远程Ubuntu 12.04 64bit服务器中,~/.vnc/xstartup文件如下: 在此处输入图像描述.

系统中的VNC Viewer客户端Windows 7 32bit如下:

在此处输入图像描述