我正在尝试创建一个计算着色器程序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);
}
我得到这种类型的链接错误信息:
ERROR::SHADER::COMPUTE_PROGRAM::LINKING_FAILED
ERROR: Duplicate function definitions for "main"; prototype: "main()" found.
我确实main
在两个着色器源代码中都有功能,我理解为什么这不起作用,因为main
一个程序中只需要一个功能。但是我的问题来了:如果我试图将顶点着色器源和片段着色器源链接到单个程序,例如,renderProgram
还有两个main
函数,一个在顶点着色器中,一个在片段着色器中。但是,如果我将这两者联系起来,它会以某种方式正常工作。
为什么会发生这种差异?如果我想使用这两个计算着色器,我是否应该创建两个计算程序以避免重复main
功能?
任何帮助表示赞赏!
为什么会发生这种差异?
当您将顶点着色器和片段着色器链接到同一个着色器程序时,这两个(正如它们的名称所暗示的)处于不同的着色器阶段。每个着色器阶段都需要一个main() 函数的定义。
当您附加位于同一着色器阶段的两个着色器(例如您的两个计算着色器对象)时,它们将链接到同一着色器阶段(计算)。那是行不通的。
如果我想使用这两个计算着色器,我是否应该创建两个计算程序以避免重复主函数?
是的。如果您有两个计算着色器,每个计算着色器都根据 main() 函数定义自己的功能,那么创建两个着色器程序,每个着色器程序都有一个链接到它的着色器对象。特别是当您的两个着色器与主机具有完全不同的接口时,例如 SSBO 或采样器/图像。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句