Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 着色器存储块名称问题_C++_Opengl_Glsl - Fatal编程技术网

C++ 着色器存储块名称问题

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

我的着色器存储块出现了一些奇怪的情况。 我有两个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_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会发生什么?事后看来,显示驱动程序崩溃了,我应该意识到会发生这种情况。如果单个任务执行时间超过2-5秒(取决于操作系统的配置),则显示驱动程序将崩溃。XD但据推测,着色器可以使用该代码成功编译,这与之前显示错误的代码不同?是的,它编译for(unsigned int i=0;i<(a_data.length()/a_data.length())*4;++i)工作,与(unsigned int i=0;i<4;++i)相同