c++ - 如何正确设置 SSBO 的提示以从着色器和 cpu 读取和写入?

标签 c++ opengl runtime-error buffer gpu

我有一个只有一个 int 的特殊 SSBO,我需要从着色器和 cpu 读取和写入。

我按如下方式创建了所述 SSBO:

glGenBuffers(1, &ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
glObjectLabel(GL_BUFFER, ssbo, -1, ("\"SSBO\""));
GLint zero = 0;
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GLint), &zero, GL_STATIC_COPY);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, ssbo);

当我渲染时,glDbeugMessage 返回:

OpenGL Event Notification:
Source: GL_DEBUG_SOURCE_API
Type: GL_DEBUG_TYPE_PERFORMANCE
ID: Unkown error code: 131186
Severity: GL_DEBUG_SEVERITY_MEDIUM
Message:
Buffer performance warning: Buffer object "SSBO" (bound to
GL_SHADER_STORAGE_BUFFER, and GL_SHADER_STORAGE_BUFFER (3), usage hint is
GL_DYNAMIC_DRAW) is being copied/moved from VIDEO memory to HOST memory. 

这个警告中最重要的是它说 SSBO 有提示:GL_DYNAMIC_DRAW 尽管我试图将提示设置为:GL_STATIC_COPY

所以我的问题是,我应该使用什么提示来防止 OpenGL 警告,以及我如何实际强制使用该提示?

最佳答案

I have a peculiar SSBO with only an int, that I need to read and write from both the shaders and the cpu.

GL_STATIC_COPY 不是这个意思。这意味着您只需分配它并写入一次(STATIC 部分)。这意味着它只能通过 GPU 操作读取/写入; CPU 永远不会直接操作数据(COPY 部分)。

所以你使用了错误的提示。

what hint should I use to prevent the OpenGL warning

如果你关心这类事情,那么你需要使用 immutable buffer allocation ,而不是老式的 glBufferData 东西。 “提示”不是绑定(bind);这就是为什么它们是“提示”而不是“要求”。

glBufferStorage 施加要求。具体来说,它对您对内存的使用提出了要求。如果您不声明可以映射缓冲区以供读取,那么您不能映射它以供读取。如果您不声明可以通过 glBufferSubData 写入,那么您不能。曾经。

选择您需要的最低使用要求集,并在这些限制范围内工作。

关于c++ - 如何正确设置 SSBO 的提示以从着色器和 cpu 读取和写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50521505/

相关文章:

opencv - DevCpp 上 OpenCV 2.3.1 中的链接器干扰

c++ - 没有动画框架的Qt动画

c++ - 使用 unique_ptr 映射变换迭代器

opengl - OpenGL 中的照明问题

opengl - 从 3D 噪声计算每顶点法线

c - OpenCV 2.1 : Runtime error

c++ - 模板函数内的静态变量

c++ - asm 函数与 c++

c++ - 用opengl绘制子像素

c++ - 在 C++ 中,不允许将对象直接传递给函数吗?