通过浏览 OpenGL 文档,我有点假设 MAX_SHADER_STORAGE_BLOCK_SIZE 是 SSBO 可能具有的实际大小限制。在我的 GPU 上,此值报告为 128 MB。但是,创建和使用更大的缓冲区(千兆字节)可以正常工作,只要它们适合视频内存。
几行代码来澄清:
在我的计算着色器中,缓冲区是通过
layout(std430, binding=2) buffer renderedDataRed
{
uint counts_SSBO[];
};
在 CPU 方面,我正在创建缓冲区
glGenBuffers(1, &drawBuffer);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, drawBuffer);
glBufferData(GL_SHADER_STORAGE_BUFFER, 4 * pixelCount, nullptr, GL_DYNAMIC_COPY);
glClearBufferData(GL_SHADER_STORAGE_BUFFER,GL_R8,GL_RED,GL_UNSIGNED_INT,nullptr);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, drawBuffer);
如前所述,让 pixelCounts 导致缓冲区大小远远超过 MAX_SHADER_STORAGE_BLOCK_SIZE...
那么,MAX_SHADER_STORAGE_BLOCK_SIZE 是否应该是实际的 SSBO 大小限制,而我的驱动程序(mesa radeonsi)只是报告了错误的数字,还是我误解了文档?难道没有明确调整大小的数组不计入 MAX_SHADER_STORAGE_BLOCK_SIZE 吗?