问题标签 [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.
c++ - 阅读时Opengl Large SSBO挂起
我有多个大小为 400400100 个整数的 SSBO(4 SSBO),我的片段着色器更新了这个 ssbo 的值。我通过调用drawelements调用来做到这一点,并在draw调用之后通过首先绑定特定的SSBO然后调用glMapBuffer并将ptr类型转换为int来读取数据。
GPU 执行繁重的处理(循环 10000 次迭代)并更新 SSBO。我在屏幕上显示的drawelement调用之后有一个打印语句,在绑定调用之后有一个打印语句,它也显示但glMapBuffer调用需要永远并挂起系统。
在 Windows 任务管理器中,大部分时间不使用 GPU,只使用 CPU。我认为这是因为 GPU 仅在绘图调用期间使用。
另外,我的理解是否正确,当我调用 glMapBuffer 时,只传输绑定的 ssbo?
你们对可能导致此问题的原因有什么建议吗?
我尝试使用 glmapbuffer 范围,这导致了类似的问题。
android - OpenGL SSBO 大小问题(仅限 Android)
我有以下问题。当使用超过特定大小的 SSBO(具有 2^15 个元素的数组)时,会读取错误值。这仍然远低于GL_MAX_SHADER_STORAGE_BLOCK_SIZE
我的设备 512MB 的限制 - 问题已经在 Kb 范围内开始。这在桌面上根本不会发生,并且一切都按预期工作 -该问题仅发生在 Android 上。
我创建了一个小样本来显示问题。可以在这里找到:https ://github.com/cbauernhofer/android_ssbo_test
基本思想是我分配了一个N字节的缓冲区,并且只使用最后 16 个字节(对应于一个vec4
)作为着色器中的直接颜色输入。这意味着我有一个偏移量 M,它是 N-16。如果M 超过 1024 * 32 (== 2^15),事情就会开始崩溃,并且会从 SSBO 读取错误值。
有趣的是,边框不是关于字节数,而是关于 SSBO 数据数组中的元素数。因此,如果我们更改为不使用vec4
但使用普通浮点数组并将着色器更改为:
和偏移量:
我得到与 vec4 实现完全相同的行为。
谁能向我解释这里发生了什么?
opengl - SSBO 可以在同一个着色器中读/写吗?
我写了一个小的镶嵌程序。我可以写入 SSBO(使用 RenderDoc 检查输出),但在同一个着色器 (TCS) 中立即读取数据似乎不起作用。如果我直接设置细分级别,我可以看到我的代码有效:
在 Tessellation Control 着色器的主体中:
但是通过SSBO内存,它不起作用。显示为空白,就像在 gl_TessLevelInner 和 gl_TessLevelOuter 输出中放置了 0。
这是 TCS 中的 SSBO:
在 Tessellation Control 着色器的主体中
在 C++ 中,我使用 nVidia 的 ShaderBuffer 类来创建包含数千个图块的数组并将数据传输到 SSBO。我确认使用 RenderDoc 将正确的数据存储在 SSBO 中。
- 在 ShaderBuffer 类中,我尝试将 glBufferData 用法更改为 GL_DYNAMIC_DRAW 而不是 GL_STATIC_DRAW 但它没有帮助。
- 我还将 SSBO 设置为 volatile 但这没有帮助。
- 我还插入了一个屏障();在 SSBO 数据的写入和读取之间,它也没有帮助。
是否可以在同一个着色器中使用 SSBO 进行写和读?
opengl - SSBO 与 VBO 性能
渲染的标准方法是首先定义 VBO,然后使用layout in
但是,使用 SSBO 可以达到完全相同的结果
我想知道这两种方法之间是否存在任何性能差异。
难道我们不能一直使用 SSBO 并完全摆脱 VBO 吗?
当然,较旧的硬件可能不支持 SSBO,但如果我不关心这种兼容性,那么真正阻止我的是什么?
arrays - 在结构中创建大型数组时,glLinkProgram 永远挂起
我正在尝试将大量数据传递给我的片段着色器,但是当我尝试编译和链接着色器时,glLinkProgram 会停止并永远挂起(没有引发错误,除了黑屏之外什么都没有发生)片段着色器成功编译,并且也成功连接。使用我的调试器单步执行它会触发glLinkProgram
调用,然后就停止了,就好像它正在等待它完成一样。如果我为结构内的数组设置较小的大小,则程序运行时不会挂起。我在文档中找不到关于内部结构数组大小限制的任何内容,所以我很好奇是什么原因造成的?
着色器.frag
着色器.vert
和我的着色器编译代码
添加我的checkCompileErrors
函数以显示我们不会意外丢失链接/编译错误。
还查询我的 GL_MAX_SHADER_STORAGE_BLOCK_SIZE 给我一个大小:2147483647
字节(2.15 GB)。我尝试发送的数据大小为 131.748 MB
这里有什么问题?显然这是由于数组大小很大,但我该如何解决这个问题?