关于在 OpenGL 中链接计算着色器程序的问题

Question about linking compute shader program in OpenGL

我正在尝试创建一个单独的计算着色器程序 computeProgram 并在其上附加两个源代码。这是我的代码:

    unsigned int computeProgram = glCreateProgram();
    glAttachShader(computeProgram, MyFirstComputeShaderSourceCode);
    glAttachShader(computeProgram, MySecondComputeShaderSourceCode);
    glLinkProgram(computeProgram);
    

    glGetProgramiv(computeProgram, GL_LINK_STATUS, &success);
    if (!success) {
        glGetProgramInfoLog(computeProgram, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::COMPUTE_PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
        exit(1);
    }

我得到这种类型的 linking 错误信息:

ERROR::SHADER::COMPUTE_PROGRAM::LINKING_FAILED
ERROR: Duplicate function definitions for "main"; prototype: "main()" found.

我在两个着色器源代码中都有 main 函数,我明白为什么这行不通,因为一个程序中只需要一个 main 函数。但是我的问题来了:如果我试图 link 一个顶点着色器源和一个片段着色器源到一个程序,比如 renderProgram,还有两个 main 函数,一个在顶点着色器中,一个在片段着色器中。但是,如果我 link 这两个,它以某种方式工作正常。

为什么会出现这种差异?如果我想使用这两个计算着色器,我是否应该创建两个计算程序以避免重复 main 函数?

感谢任何帮助!!

Why is this difference happen?

当您 link 一个顶点着色器和一个片段着色器到同一个着色器程序时,那么这两个(顾名思义)处于不同的着色器 阶段 。每个着色器 stage 都需要 main() 函数的 one 定义。

当您附加 两个 相同着色器 stage 中的着色器时,例如您的两个计算着色器对象,那么它们会得到 link进入同一个着色器stage(计算)。那是行不通的。

And if I want to use these two compute shaders, am I supposed to create two compute programs in order to avoid duplication of the main function?

是的。当你有两个计算着色器,每个计算着色器都根据 main() 函数定义自己的功能时,然后创建两个着色器程序,每个着色器程序都包含一个着色器对象 linked 就可以了。特别是,当您的两个着色器与主机具有完全不同的接口时,例如 SSBO 或 samplers/images.