使用 GL_SHADER_STORAGE_BUFFER 将数组传递给片段着色器

Pass an array to the fragment shader using GL_SHADER_STORAGE_BUFFER

我想将 class 传递给包含一些数据的片段着色器。问题是我无法传递大小为 100 的数组。

我将 class 作为数据传递:

struct MetaData {
    int rows;
    int columns;

    float cellSizeX;
    float cellSizeY;

    int mask[10][10];
}metaData;

glGenBuffers(1, &ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(metaData), &metaData, GL_DYNAMIC_COPY);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, ssbo);

glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
GLvoid* p = glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_WRITE_ONLY);
memcpy(p, &metaData, sizeof(metaData));
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);

并且在着色器中在顶点着色器中接受它为:

layout (std430, binding=3) buffer shader_data
{ 
    int rows;
    int columns;

    float cellSizeX;
    float cellSizeY;

    int mask[10][10];
};

flat out int Mask[10][10];

int main(){
    ...some code...

    Mask = mask;

    ...some code...
}

并在fragment shader中接受了,但是显示如下错误,不知如何解决。

cannot locate suitable resource to bind variable "Mask". Possibly large array.

据我在网上搜索了解到glGet(GL_MAX_VARYING_FLOATS_ARB)的数量是有一定限制的。有什么办法可以避免这种情况吗?

嗯,您知道可以在着色器中访问着色器存储缓冲区,对吗? 'Fragment shaders' 属于总称 'shaders',因此与其复制每个顶点的结构,不如将以下内容添加到您的片段着色器,然后直接访问数据? :p


// Add to the fragment shader source..... 
layout (std430, binding=3) buffer shader_data
{ 
    int rows;
    int columns;

    float cellSizeX;
    float cellSizeY;

    int mask[10][10];
};