C++ 着色器存储块名称问题
我的着色器存储块出现了一些奇怪的情况。 我有两个SSB:C++ 着色器存储块名称问题,c++,opengl,glsl,C++,Opengl,Glsl,我的着色器存储块出现了一些奇怪的情况。 我有两个SSB: #version 450 core out vec4 out_color; layout (binding = 0, std430) buffer A_SSB { float a_data[]; }; layout (binding = 1, std430) buffer B_SSB { float b_data[]; }; void main() { a_data[0] = 0.0f; a_dat
#version 450 core
out vec4 out_color;
layout (binding = 0, std430) buffer A_SSB
{
float a_data[];
};
layout (binding = 1, std430) buffer B_SSB
{
float b_data[];
};
void main()
{
a_data[0] = 0.0f;
a_data[1] = 1.0f;
a_data[2] = 2.0f;
a_data[3] = 3.0f;
b_data[0] = 90.0f;
b_data[1] = 81.0f;
b_data[2] = 72.0f;
b_data[3] = 63.0f;
out_color = vec4(0.0f, 0.8f, 1.0f, 1.0f);
}
这很好,但如果我像这样交换SSB名称:
layout (binding = 0, std430) buffer B_SSB
{
float a_data[];
};
layout (binding = 1, std430) buffer A_SSB
{
float b_data[];
};
glCreateBuffers(1, &a_ssb);
glNamedBufferStorage(a_ssb, 7187400 * 9 * sizeof(float), nullptr, GL_MAP_READ_BIT);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, a_ssb);
glShaderStorageBlockBinding(test_prog, 0, 0);
glCreateBuffers(1, &b_ssb);
glNamedBufferStorage(b_ssb, 7187400 * 9 * sizeof(float), nullptr, GL_MAP_READ_BIT);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, b_ssb);
glShaderStorageBlockBinding(test_prog, 1, 1);
虽然SSB索引是硬编码的,但它们是交换的,应该写入a_数据的数据会写入b_数据,反之亦然。
两个SSB都是250MB大的,最大大小超过2GB。看起来索引是按字母顺序分配的,但这不应该发生。我像这样绑定缓冲区:
layout (binding = 0, std430) buffer B_SSB
{
float a_data[];
};
layout (binding = 1, std430) buffer A_SSB
{
float b_data[];
};
glCreateBuffers(1, &a_ssb);
glNamedBufferStorage(a_ssb, 7187400 * 9 * sizeof(float), nullptr, GL_MAP_READ_BIT);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, a_ssb);
glShaderStorageBlockBinding(test_prog, 0, 0);
glCreateBuffers(1, &b_ssb);
glNamedBufferStorage(b_ssb, 7187400 * 9 * sizeof(float), nullptr, GL_MAP_READ_BIT);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, b_ssb);
glShaderStorageBlockBinding(test_prog, 1, 1);
这是错误还是我的错?我还想问,如果我在for循环中赋值,为什么会出现错误“数组访问中的左值太复杂或可能的数组索引超出范围”
for(unsigned int i = 0; i < 4; ++i)
a_data[i] = float(i);
for(无符号整数i=0;i<4;++i)
a_data[i]=浮点数(i);
这是你的问题
您在着色器中指定了绑定索引。您不需要再次分配它
你的问题来自于你错误地分配了它
是要为其指定绑定索引的块的索引。获得正确索引的唯一方法是通过查询。块索引是通过此调用查询的:
auto block_index = glGetProgramResourceIndex(test_prog, GL_SHADER_STORAGE_BLOCK, "A_SSB");
恰好在您的原始代码中,着色器编译器将A_SSB
的资源索引指定为0,将B_SSB
的资源索引指定为1。这项任务可能是根据他们的名字任意完成的。因此,当您更改它们的名称时,资源索引没有更改。所以A_SSB
仍然是资源索引0,但着色器将其指定为绑定索引1。这很好
<> >直到C++代码覆盖了您的<代码> GHSDER存储库绑定(TestPro,0, 0)< /C>。将资源索引0(A_SSB
)分配给绑定索引0的
您应该在着色器中设置绑定索引,或者在C++代码中设置绑定索引。并非两者都有。
关于第二个问题:如果将循环重写为(unsigned int i=0;i