我的着色器存储缓冲区中似乎有不确定的数据。
我曾经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)
得到不确定的结果?