我在调用glClear之后试图在OpenGL中使用计算着色器但是对glDispatchCompute的调用总是给我"生成GL_INVALID_OPERATION错误。状态无效:程序管道配置。" gpu是NVidia Quadro K5100M,驱动程序版本为376.54。 我创建了一个小型测试程序,它只加载一个计算着色器,清除并调用dispatch。 我的渲染循环如下所示:
glClear(GL_COLOR_BUFFER_BIT);
glUseProgramStages(ProgramPipeline, GL_COMPUTE_SHADER_BIT, ComputeShader);
glDispatchCompute(1, 1, 1);
glUseProgramStages(ProgramPipeline, GL_ALL_SHADER_BITS, 0);
只有在glClear之后直接调用glUseProgramStages时才会出现错误。当我遗漏清除或只是用glUseProgramStages切换它时,不再有错误。当我在结束时删除着色器重置时,我只在第一次迭代中得到一个错误,但之后它就可以了。 着色器和管道本身就是这样创建的:
glGenProgramPipelines(1, &ProgramPipeline);
glBindProgramPipeline(ProgramPipeline);
GLuint ShaderID = glCreateShader(GL_COMPUTE_SHADER);
GLint Result;
GLint InfoLogLength;
glShaderSource(ShaderID, 1, &pShader, NULL);
glCompileShader(ShaderID);
glGetShaderiv(ShaderID, GL_COMPILE_STATUS, &Result);
glGetShaderiv(ShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
if (InfoLogLength > 0) {
std::vector<char> Error(InfoLogLength + 1);
glGetShaderInfoLog(ShaderID, InfoLogLength, NULL, &Error[0]);
std::cout << Error.data() << '\n';
}
GLuint ProgramID = glCreateProgram();
glProgramParameteri(ProgramID, GL_PROGRAM_SEPARABLE, GL_TRUE);
glAttachShader(ProgramID, ShaderID);
glLinkProgram(ProgramID);
glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
if (InfoLogLength > 0) {
std::vector<char> Error(InfoLogLength + 1);
glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &Error[0]);
std::cout << &Error[0] << '\n';
}
ComputeShader = ProgramID;