问题标签 [shader-storage-buffer]

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

opengl - 在 glBufferData 之后,非确定性 SSBO 的 GL_BUFFER_DATA_SIZE 太小

我的着色器存储缓冲区中似乎有不确定的数据。

我曾经apitrace检查状态机并注意到跟踪中的以下函数调用序列:

根据更高级别的应用程序代码,这似乎是正确的,它与设置此匹配

到一个以长度为前缀的数组glm::vec4[2]

但是,apitrace显示GL_BUFFER_DATA_SIZE在上述跟踪中的每个阶段都是 32,而不是 36。

此外,这是对 SSBO 的检查:

在此处输入图像描述

Components.colour[0]GL_ARRAY_SIZE=0(这不应该是非零吗?)和GL_OFFSET=16(这不应该是 4 吗?)

该程序非常简单,所以为了更好地衡量,这是完整的跟踪(这是针对第 1 帧的,glBufferData(...,36,...)在第 0 帧中并且没有重复):

在此处输入图像描述

  1. GL_BUFFER_DATA_SIZE鉴于我的呼吁,SSBO 不应该有=36glBufferData吗?如果是这样,这是驱动程序错误吗?如果它规定的 32 大小是正确的,你能解释一下这是怎么回事吗?

  2. GL_ARRAY_SIZEGL_OFFSET正确吗?

  3. 鉴于检查glBufferSubData调用,我的数组glm::vec4[2]描述了正确的确定性数据,此跟踪中是否有任何内容可以解释为什么当我b_components.colour[i]在其中读取时for (int i = 0; i < b_components.count; ++i)得到不确定的结果?

0 投票
1 回答
113 浏览

java - 在 JOGL 中遇到 SSBO 问题

我一直在尝试初始化 SSBO 并将其传递给计算着色器。

在着色器中我有:

当我运行它时,sph 充满了 0-s。我试图从缓冲区中读取数据:

这让我收到错误 1281,也就是 0 + a.size() > ssbo 的大小。然后我检查了 SSBO 的实际大小:

这给了我 0。我用过这篇文章。我对 OpenGL 很陌生,所以我的代码中可能有一个非常明显的错误,这就是为什么我在这里包含了这么多。

谢谢指教!

编辑:LWJGL 版本是 3.2.1 build 12

0 投票
1 回答
502 浏览

c++ - GL_SHADER_STORAGE_BUFFER 的 glGetBufferSubData 和 glMapBufferRange 在 NVIDIA GTX960M 上非常慢

我在将 GPU 缓冲区传输到 CPU 以执行排序操作时遇到了一些问题。缓冲区GL_SHADER_STORAGE_BUFFER由 300.000 个浮点值组成。传输操作glGetBufferSubData需要大约 10 毫秒,而glMapBufferRange需要超过 100 毫秒。

我使用的代码如下:

主要在做:

其中 countPixs 是一个计算着色器,但我很肯定问题不存在,因为如果我评论运行命令,读取所需的时间完全相同。

奇怪的是,如果我执行一个只有 1 个浮点数的 getbuffer:

它需要完全相同的时间......所以我猜一路有问题......可能与GL_SHADER_STORAGE_BUFFER

0 投票
1 回答
60 浏览

java - 流并行加载到着色器存储缓冲区对象

我正在尝试并行加载整数数组,但出现错误:

没有parallel()工作正常的实施:

以及 for 循环:

错误:

可以并行使用 glBufferSubData 吗?

我用 lwjgl 3

0 投票
0 回答
222 浏览

java - Shader Storage Buffer Object 元素读取优化

我使用着色器存储缓冲区对象进行三线性插值。所以我像这样在片段着色器中访问我的 ssbo:

layout(std430, binding = 0) buffer ColorSSBO { int value[]; };

它变得非常低效,因为这个缓冲区很大,如果我可以一次读取数组的多个元素,那就太好了,或者至少是那些连续的

我不需要修改这个数组,我觉得我错过了一些东西,也许有一些 readonly 的关键字

这就是我使用 lwjgl 加载 ssbo 的方式:

0 投票
0 回答
348 浏览

append - 是否有一种有效的方法可以在使用 GLSL 的计算着色器中的 SSB 中附加值?

我有一个 OpenGL 计算着色器,它生成未定义数量的顶点并将它们存储在着色器存储缓冲区 (SSB) 中。SSB 容量足够大,因此计算着色器永远不会生成超出其容量的顶点数量。我需要生成的值从一开始就填充缓冲区并且没有不连续性(就像push_back在 C++ 上使用一样vector)。为此,我使用原子计数器来计算生成一个时将顶点值放置在 SSB 中的位置的索引。这种方法似乎有效,但会使计算着色器运行得更慢。下面是 GLSL 函数的样子:

SSB 定义vertices在哪里:vec3

AndnumberOfVertices是一个原子计数器缓冲区,其值在运行着色器之前被初始化为 0。

一旦着色器完成运行,我可以在 CPU 端加载回numberOfVertices变量,以了解存储在缓冲区中的已创建顶点的数量 range [0; numberOfVertices*3*sizeof(float)]。在测量着色器运行的时间(使用glBegin/EndQuery(GL_TIME_ELAPSED))时,我得到大约50ms。然而,当删除atomicCounterIncrement线(因此也没有将顶点分配到数组中)时,测量的时间大约是几毫秒。随着我增加工作组的数量,这种差距也会增加。

我认为问题可能是由于使用了原子操作引起的。那么有没有更好的方法在 SSB 中附加值?一旦着色器完成运行,在某种程度上也会给我附加值的总数?

编辑:经过一些重构和测试后,我注意到实际上是缓冲区 ( vertices[index] = vertex;) 中的值分配减慢了所有速度(删除此行时减少了大约 40 毫秒)。我应该通知该createVertex()函数是在 for 循环内调用的,着色器实例之间的循环数不同。

0 投票
0 回答
34 浏览

opengl - Having each invocation of a GLSL compute shader write to an SSBO variable without race conditions

I'm trying to a write a simple compute shader which will take in an array of points as well as two points which define a line. I would like to invoke the shader for each point in the array, have all the distances calculated in parallel and then have each invocation wait it's turn in a busy loop to update the farthest point data. My compute shader looks like this

What I'm finding is that my application will show different results even though I am running it on the same set of data. Have I done something wrong?