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

时间:2019-11-05 02:41:26

标签: opengl glsl fragment-shader

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

我将类作为数据传递:

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...
}

并在片段着色器中接受它,但显示以下错误,我不知道该如何解决。

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

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

1 个答案:

答案 0 :(得分:2)

嗯,您知道您可以在着色器中访问着色器存储缓冲区,对吗? “片段着色器”属于术语“着色器”,因此与其复制每个顶点的结构,不如将以下内容添加到片段着色器中并直接访问数据? :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];
};
相关问题