我试图创建单个计算着色器程序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。