【发布时间】:2018-03-11 22:20:07
【问题描述】:
通过浏览 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 吗?
【问题讨论】:
-
规范说:“如果任何着色器存储块所需的存储量超过此限制,程序将无法链接。”由于您没有声明具有固定大小的着色器存储块,因此我不知道 glsl 编译器应该如何检查。
-
只是出于好奇:在着色器中访问 128MB 之后的缓冲区是否会影响输出?
-
是的,计算着色器用数据填充缓冲区,这些数据由片段着色器渲染,然后也读回主内存并存储到图像文件中。由于图像中的每个像素都具有非零颜色,因此计算着色器显然会触及每个数组元素。
标签: opengl shader-storage-buffer