我想将一个类传递给包含一些数据的片段着色器。问题是我无法传递大小为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)
。有什么办法可以避免这种情况?
嗯,您知道您可以在着色器中访问着色器存储缓冲区吗?“片段着色器”属于术语“着色器”,因此与其复制每个顶点的结构,不如将以下内容添加到片段着色器中并直接访问数据?: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];
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句