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

How to properly set the hint of an SSBO to read and write from both shaders and cpu?

本文关键字:CPU 读取 SSBO 设置 何正确 提示      更新时间:2023-10-16

我有一个特殊的SSBO,只有一个int,我需要从着色器和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 警告,我如何实际强制执行该提示的使用?

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

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

所以你用错了提示。

我应该使用什么提示来防止 OpenGL 警告

如果你关心这种事情,那么你需要使用不可变的缓冲区分配,而不是旧式的glBufferData的东西。"提示"不是绑定;这就是为什么它们是"提示"而不是"要求"。

glBufferStorage提出了要求。具体来说,它对您使用内存提出了要求。如果未声明缓冲区可以映射以进行读取,则无法映射缓冲区以进行读取。如果你不声明你可以通过glBufferSubData写入,那么你不能。曾。

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