首页 > 解决方案 > 在 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 帧中并且没有重复):

在此处输入图像描述

  1. GL_BUFFER_DATA_SIZE鉴于我的呼吁,SSBO 不应该有=36glBufferData吗?如果是这样,这是驱动程序错误吗?如果它规定的 32 大小是正确的,你能解释一下这是怎么回事吗?

  2. GL_ARRAY_SIZEGL_OFFSET正确吗?

  3. 鉴于检查glBufferSubData调用,我的数组glm::vec4[2]描述了正确的确定性数据,此跟踪中是否有任何内容可以解释为什么当我b_components.colour[i]在其中读取时for (int i = 0; i < b_components.count; ++i)得到不确定的结果?

标签: openglshader-storage-bufferbuffer-objects

解决方案


推荐阅读