调用glClear后为什么glDispatchCompute会失败?

时间:2017-03-30 11:48:59

标签: opengl graphics glsl shader

我在调用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;

0 个答案:

没有答案