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

我想将一个类传递给包含某些数据的片段着色器。问题是我无法传递大小为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,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)的数量受到一定限制。有什么办法可以避免这种情况?

dahom 回答:使用GL_SHADER_STORAGE_BUFFER将数组传递给片段着色器

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

大家都在问