关于在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_FAILEDn" << infoLog << std::endl;
exit(1);
}
我得到这种类型的链接错误信息:
ERROR::SHADER::COMPUTE_PROGRAM::LINKING_FAILED
ERROR: Duplicate function definitions for "main"; prototype: "main()" found.

我确实在两个着色器源代码中都有main函数,我理解为什么这不会起作用,因为在一个程序中只有一个main函数。但这里有我的问题:如果我试图链接一个顶点着色器源和一个片段着色器源到一个程序,说,renderProgram,也有两个main函数,一个在顶点着色器,一个在片段着色器。但是,如果我把这两个链接起来,它就会正常工作。

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

任何帮助都是感激的!

为什么会出现这种差异?

当你链接一个顶点着色器和一个片段着色器到相同的着色器程序,那么这两个(正如他们的名字所暗示的)是在不同的着色器阶段。每个shaderstage期望main()函数的一个定义。

当你附加两个着色器在相同的着色器阶段,比如你的两个计算着色器对象,然后它们被链接到相同的着色器阶段(计算)。但这行不通。

如果我想使用这两个计算着色器,我是否应该创建两个计算程序以避免主函数的重复?

是的。当你有两个计算着色器,每个都根据main()函数定义自己的功能时,那么创建两个着色器程序,每个都有一个着色器对象链接到它就可以了。特别是,当你的两个着色器与主机有完全不同的接口时,比如SSBOs或sampler/images。

最新更新