如何正确设置 SSBO 的提示以从着色器和 CPU 读取和写入?
How to properly set the hint of an SSBO to read and write from both shaders and cpu?
我有一个特殊的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
写入,那么你不能。曾。
选择所需的最低使用要求集,并在这些限制范围内工作。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 如何正确设置 SSBO 的提示以从着色器和 CPU 读取和写入?
- 多核 CPU 上 32 位读取的原子性
- 使用 fgets() c++ 读取大型 txt 文件时的 CPU 使用率为 99%
- 直接从 CPU 读取TEMPERATURE_TARGET
- 读取文件,将其拆分为部分并将其传递给其他类,而不会过度使用内存或CPU
- x64 CPU上的原子16字节读取
- 从/dev/ ttyacm0读取时cpu负载高