问题标签 [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.
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 帧中并且没有重复):
GL_BUFFER_DATA_SIZE
鉴于我的呼吁,SSBO 不应该有=36glBufferData
吗?如果是这样,这是驱动程序错误吗?如果它规定的 32 大小是正确的,你能解释一下这是怎么回事吗?GL_ARRAY_SIZE
和GL_OFFSET
正确吗?鉴于检查
glBufferSubData
调用,我的数组glm::vec4[2]
描述了正确的确定性数据,此跟踪中是否有任何内容可以解释为什么当我b_components.colour[i]
在其中读取时for (int i = 0; i < b_components.count; ++i)
得到不确定的结果?
java - 在 JOGL 中遇到 SSBO 问题
我一直在尝试初始化 SSBO 并将其传递给计算着色器。
在着色器中我有:
当我运行它时,sph 充满了 0-s。我试图从缓冲区中读取数据:
这让我收到错误 1281,也就是 0 + a.size() > ssbo 的大小。然后我检查了 SSBO 的实际大小:
这给了我 0。我用过这篇文章。我对 OpenGL 很陌生,所以我的代码中可能有一个非常明显的错误,这就是为什么我在这里包含了这么多。
谢谢指教!
编辑:LWJGL 版本是 3.2.1 build 12
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
?
java - 流并行加载到着色器存储缓冲区对象
我正在尝试并行加载整数数组,但出现错误:
没有parallel()
工作正常的实施:
以及 for 循环:
错误:
可以并行使用 glBufferSubData 吗?
我用 lwjgl 3
java - Shader Storage Buffer Object 元素读取优化
我使用着色器存储缓冲区对象进行三线性插值。所以我像这样在片段着色器中访问我的 ssbo:
layout(std430, binding = 0) buffer ColorSSBO { int value[]; };
它变得非常低效,因为这个缓冲区很大,如果我可以一次读取数组的多个元素,那就太好了,或者至少是那些连续的
我不需要修改这个数组,我觉得我错过了一些东西,也许有一些 readonly 的关键字
这就是我使用 lwjgl 加载 ssbo 的方式:
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 循环内调用的,着色器实例之间的循环数不同。
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?