问题标签 [ssbo]

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

android - 使用 OpenGL ES 在屏幕上渲染浮动缓冲区

我有一个 FloatBuffer 作为神经网络的输出,其中 RGB 通道用 [-1 .. +1] 值编码。我想使用 GLSurfaceView 在屏幕上渲染它们。处理它的最佳方法是什么?

我可以将缓冲区转储到 SSBO 并编写一个计算着色器,将其映射到 [0 .. 255] 范围的 ByteBuffer,然后以某种方式将其绑定到常规纹理。或者也许我可以设置我的计算着色器直接输出到一些纹理缓冲区?或者我应该直接从片段着色器中读取我的 SSBO(并实现我自己的线性插值)?

那么,通过 OpenGL ES 渲染内容的最佳方式是什么?请帮忙。

0 投票
0 回答
310 浏览

performance - 几何着色器和 SSBO 性能中的顶点索引

我正在构建一个着色器程序和 GL 主机环境,它可以完成一项相对简单的任务:

  1. 在多个三角形(补丁)上运行 VS -> TCS -> TES -> GS 着色器阶段集。TES/TCS 确实会产生额外的镶嵌三角形。
  2. 创建一个由足够多的 vec4 元素组成的简单 SSBO。SSBO 将保存镶嵌的结果,即镶嵌顶点的坐标
  3. 在 GS 运行期间,GS 会将三角形顶点写入 SSBO,以使单个三角形的顶点步长为三个,即(triangle1, vert1), (triangle1, vert2), (triangle1, vert3), (triangle2, vert1), (triangle2, vert2),(triangle2, vert3)等。

为了索引我的 SSBO,我需要以某种方式推断“triangleID”。我仔细阅读了 GS/Tess 规格并做了一些实验。似乎 GS 内置输入只是没有它。gl_PrimitiveIDIn 似乎指的是在顶点着色器中看到的三角形的原始索引,并且在细分期间它没有增加。

最后,我想到了拥有另一个 SSBO 的想法/解决方法,该 SSBO 将具有一个“原始计数器”,atomicAdd(primCount, 1)每次执行 GS 时都会递增:

昨天我花了很多时间来完善上面的代码,因为我在路上遇到了各种各样的赛车条件。现在看来,它在我的 GPU/驱动程序上起到了作用,但我不完全确定它是 100% 正确的。

所以我的第一个问题是:

  • 在我的情况下推断三角形索引的最佳方法是什么?上面的代码是免费的?

我的第二个问题是关于性能:

  • 我有另一个基于变换反馈对象和缓冲区的任务实现,我必须说它的工作速度快 4 倍(每帧 2.0 毫秒对 0.5 毫秒)。我想知道为什么 SSBO 后端比 TF 后端慢得多,我能做些什么来让它运行得更快吗?

PS 完整代码在这里:https ://pastebin.com/SagKZEyi

PSS 使用 DrawArraysIndirect() 更新的代码在这里:https ://gist.github.com/lhog/432af74ba41259e062f18910b5904684

谢谢!

0 投票
1 回答
240 浏览

android - glMapBufferRange 在三星 Galaxy S8 / S10 / Note 10 Lite 上出现 GL_OUT_OF_MEMORY 失败

我正在使用适用于 Android 的 CameraView 库从相机中捕获帧并使用 OpenGL 着色器对其进行处理。我在尝试使用计算着色器时遇到了一些奇怪的行为。我想抓取一个相机帧作为浮点的 RGB 缓冲区,在 CPU 上处理它,然后用 OpenGL 渲染它。我继承了 CameraView 的 BaseFilter,设置了我的计算程序和 SSBO 缓冲区,在 onPreDraw() 中调度计算,最后在表面上渲染相机帧,就像所有其他过滤器一样。

一切正常,直到我开始录制视频或在正面和背面之间切换相机。无论我运行过滤器多长时间,一旦我切换面对,我就不再能够使用 glMapBufferRange 获取我的 SSBO 的内容。OpenGL 调用失败,错误代码为 GL_OUT_OF_MEMORY,我认为它代表随机的“无法获取缓冲区”错误。

在设置过滤器之前在正面和背面之间切换无效 - 过滤器将开始以当前面正常运行,但在下一次切换后立即失败。令人惊讶的是,在切换之前将过滤器设置为 NONE 并没有帮助:我可以从正面开始过滤器,然后将过滤器设置为 NONE,然后切换面向,然后再次设置过滤器,它会失败。如果我重新使用我的过滤器实例或每次将它设置为 CameraView 时创建一个新实例,这并不重要。

一些随机观察:

  1. 此问题仅发生在三星设备上,已在 Galaxy S8、Galaxy S10 和 Galaxy Note 10 Lite 上确认。此问题无法在 Google Pixel 3 上重现
  2. 当我将计算着色器修改为不通过 samplerExternalOES 对相机帧进行采样时,无法重现此问题。一切正常。
  3. 当我修改我的计算着色器以不向 SSBO 执行任何输出时,无法重现此问题。一切正常。

我的计算着色器看起来像这样(重现问题的示例代码):

这是整个过滤器类,它可以重现问题(为清楚起见,省略了所有错误检查,相关的除外):

请帮忙。我对 samplerExternalOES 或 SSBO 或两者都做错了吗?还是 CameraView 库问题?

0 投票
1 回答
60 浏览

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

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

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

以及 for 循环:

错误:

可以并行使用 glBufferSubData 吗?

我用 lwjgl 3

0 投票
1 回答
166 浏览

c++ - 最小保证着色器存储块大小是多少?

如果它存在,我似乎找不到它。我遇到了统一缓冲区的问题,其中 gl 规范给出的最小大小仅为 1024 个位置。我可以在着色器中为 SSBO 引用的位置数量是否有设定的最小值?例如,如果我希望能够访问 10,000mat4秒?

此外,在当前的现代硬件上,使用 SSBO 与使用顶点缓冲区之间是否存在显着的性能差异?

使用 SSBO、VBO 或几何着色器大致比较如何?(这在存储/扩展顶点的上下文中)。如果没有一般案例答案,我将对其进行分析。

0 投票
0 回答
210 浏览

java - 如何在 LWJGL 中将 SSBO 数据读入 CPU

我想要一个在输出缓冲区中写入 1 的计算着色器。我编译着色器并将其附加到程序中,然后调用 glDispatchCompute() 函数并等待计算着色器结束。我现在唯一的问题是我不确定如何将输出的 SSBO 转换为浮点数组。

检索代码

计算着色器

我已经尝试解决这个问题好几个小时了,但我仍然找不到任何线程来回答如何将 glMapBuffer 转换为 float []。我不确定是因为我的代码错误还是有更好的方法来做到这一点。这是使用 LWJGL 用 java 编写的。

0 投票
1 回答
413 浏览

c++ - SSBO 绑定点索引可以是任何值吗?

当您在着色器中指定“location = x”以指定着色器存储或统一缓冲区绑定点时,该数字可以是任何值吗?这个绑定点是否独立于当前绑定的着色器?

是否可以在绑定着色器之前绑定我的所有 ubos 和 ssbos,只要着色器使用的每种类型的缓冲区的数量 <= OpenGL 允许一次在着色器中使用的最大值?

我可以绑定 20 个缓冲区,然后通过在着色器中指定绑定点索引来指定着色器当前正在使用哪些缓冲区吗?

0 投票
1 回答
272 浏览

opengl - OpenGL SSBO 实例化

绑定 SSBO 并通过 gl_InstanceID 访问它似乎可行,但我得到了这些非常奇怪的位置工件,我不确定它们来自哪里。

我生成随机位置的方式非常标准,我还用一些调试线测试了这些位置。但是当我在顶点着色器中添加它们时它们不匹配。

着色器.vert

代码.cpp

在此处输入图像描述 在此处输入图像描述

0 投票
0 回答
93 浏览

c - GLSL 片段着色器能否在没有帧缓冲区和类似不便的情况下运行?

重复上述内容:GLSL 片段着色器可以在没有帧缓冲区和任何光栅化阶段的情况下运行吗?

这个完美的答案提供了一个关于从哪里开始的见解SSBO。答案有一个指向具有样板代码的OpenGL ARB 扩展的链接。OpenGL如果对计算程序进行了一些更改,则该代码对我有用。但是,我真的不明白,片段程序怎么办?并且除了SSBO.

该代码显然有片段源代码,没有任何像素操作,只有SSBO一个。

稍后在C程序文件中:

根据我的设置,我没有任何使用OpenGL 像素的输出。我希望它保持这样。有可能吗,还是我错过了什么?

PS 上面的设置在紧跟glDrawElements.glFinish

更新 21.03.2021

有一个没有附件的帧缓冲区。您唯一应该设置它的状态是它的宽度和高度。如果有人希望最小化设置,那在某种程度上是任何人的方向。

上述的缺点是它仍然需要一些几何图形来馈送到光栅化阶段。要开始着色器阶段,你知道的。但是,作为一个优点,一个人得到几何光栅化,不管你愿不愿意。

如果我有时间,我会留下一些代码作为自己的提醒。

0 投票
0 回答
50 浏览

glsl - 用于将双精度值数组传递给着色器的 GLSL SSBO

我试图通过将其作为 SSBO 传递给 OpenGLSL 着色器来获取一个 2D 双精度数组。

着色器代码是

我的(Delphi)设置SSBO的代码是(ssbo被声明为gluint)

设置统一值后,我在着色器的每一帧都调用 SetShaderStorageBufferObject。

我希望每次更新都能获得静态图像,因为我将 SSBO 设置为随机双精度值,但它只显示黑色图像。

除了这个 SSBO 之外,我处理 GLSL 的其余代码工作正常,我可以毫无问题地运行其他没有 SSBO 的着色器代码,所以我希望上面的代码或着色器代码错过了一些愚蠢的东西。

关于可能出了什么问题的任何想法?