opengl - 在 glBufferData 之后,非确定性 SSBO 的 GL_BUFFER_DATA_SIZE 太小
问题描述
我的着色器存储缓冲区中似乎有不确定的数据。
我曾经apitrace
检查状态机并注意到跟踪中的以下函数调用序列:
glBindBuffer (GL_SHADER_STORAGE_BUFFER, 3);
glBufferData (GL_SHADER_STORAGE_BUFFER, 36, NULL, GL_DYNAMIC_DRAW);
glBufferSubData (GL_SHADER_STORAGE_BUFFER, 0, 4, [binary data, size = 4 bytes])
glBufferSubData (GL_SHADER_STORAGE_BUFFER, 4, 32, [binary data, size = 32 bytes])
根据更高级别的应用程序代码,这似乎是正确的,它与设置此匹配
layout (std140) buffer Components
{
int count;
vec4 colour [];
}
b_components;
到一个以长度为前缀的数组glm::vec4[2]
。
但是,apitrace
显示GL_BUFFER_DATA_SIZE
在上述跟踪中的每个阶段都是 32,而不是 36。
此外,这是对 SSBO 的检查:
Components.colour[0]
有GL_ARRAY_SIZE
=0(这不应该是非零吗?)和GL_OFFSET
=16(这不应该是 4 吗?)
该程序非常简单,所以为了更好地衡量,这是完整的跟踪(这是针对第 1 帧的,glBufferData(...,36,...)
在第 0 帧中并且没有重复):
GL_BUFFER_DATA_SIZE
鉴于我的呼吁,SSBO 不应该有=36glBufferData
吗?如果是这样,这是驱动程序错误吗?如果它规定的 32 大小是正确的,你能解释一下这是怎么回事吗?GL_ARRAY_SIZE
和GL_OFFSET
正确吗?鉴于检查
glBufferSubData
调用,我的数组glm::vec4[2]
描述了正确的确定性数据,此跟踪中是否有任何内容可以解释为什么当我b_components.colour[i]
在其中读取时for (int i = 0; i < b_components.count; ++i)
得到不确定的结果?
解决方案
推荐阅读
- python-3.x - 使用 f 字符串时,如何设置要在整个模块中使用的标准格式说明符?
- flutter - 颤振显示专业徽章的火力基地人物
- powershell - 如何使用 Powershell 强制 Nuget 还原?
- javascript - 单击提交按钮后,JavaScript 输入字段值未提交
- javascript - 如何使用face-api js在控制台中获取视频内的人脸位置检测点?
- sharepoint-online - CSOM 返回“尝试的操作被禁止,因为它超过了列表视图阈值。” 如果返回多个结果 -SP Online
- c++ - 主循环不退出 SDL2、C++
- serverless - 无服务器 CloudFront 缓存策略
- python - 按值更改散点图的大小
- php - 将 Json 对象分成一次