OpenGL glUseProgram失败(错误1282 - INVALID_OPERATION)

时间:2017-05-01 16:16:06

标签: c++ opengl sdl-2

在我开始之前。我的着色器程序成功链接,以及所有链接的单元 编译成功。

所以,我有一个OpenGL程序,SDL2的实现设置为使用GL版本4.0的核心配置文件

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
//...
mSimWindow.makeGLContext();      //inlines : mOpenGL = SDL_GL_CreateContext(mWindow);
mSimWindow.makeContextCurrent(); //inlines : SDL_GL_MakeCurrent(mWindow, mOpenGL);

此时没有错误。

我正在使用shader程序的整体varriaty。我有两个课程来处理这个, Shader和ShaderProgram,前者仅用于后者。

ShaderProgram的构造函数接受两个文件路径,用于顶点着色器和片段着色器。

以下是这些类的相关代码;

bool
Shader::compile()
{
    if (mType == Type::Undefined)
        return false;

    mShader = glCreateShader(static_cast<GLenum>(mType));

    const GLchar * src = mRaw.c_str();
    glShaderSource(mShader, 1, &src, nullptr);
    glCompileShader(mShader);

    GLint success = 0;
    glGetShaderiv(mShader, GL_COMPILE_STATUS, &success);

    if (success!=0)
    {
        //... some error handling
        return false;
    }

    return true;
}

bool
ShaderProgram::link()
{
    mProgram = glCreateProgram();

    glAttachShader(mProgram, mVertexShader->shaderID());
    glAttachShader(mProgram, mFragmentShader->shaderID());  

    glLinkProgram(mProgram);
    glDetachShader(mProgram, mVertexShader->shaderID());
    glDetachShader(mProgram, mFragmentShader->shaderID());

    GLint isLinked;
    glGetProgramiv(mProgram, GL_LINK_STATUS, (int *)&isLinked);

    return (isLinked==0) ? true : false;        
}

以上就像这样使用

Graphics::ShaderProgram sp(".\\Shaders\\vertex.vert",
        ".\\Shaders\\fragment.frag");   

//...
glClearColor(0.3, 0.3, 0.3, 1);
while (!(mSimState == SimulationState::Quiting))
{
    SDL_PumpEvents();
    glClear(GL_COLOR_BUFFER_BIT);
    sp.use();
    mesh.use();
    //TwDraw();
    mSimWindow.glSwap();
}

最后,

void 
ShaderProgram::use()
{
    glUseProgram(mProgram);
    auto e = glGetError();
}

e最终为1282(INVALID_OPERATION)

如果在glUseProgram(..)之前的任何时候我调用glGetError()它返回0.所以问题是以某种方式与该调用有关。我不太明白的一个怪癖是如果我给程序提供一些几何 它会以某种方式设法实际呈现它,只是不使用我的着色器。

实施例。 enter image description here

我很困惑,任何帮助或建议都会受到赞赏。

编辑:

作为后续行动。出于某种原因,我认为0是真的,叹息。使用GL_TRUE(1)导致我的错误处理代码实际显示错误。

在阅读着色器时我犯了同样的错误:glsl shader compilation issue at runtime

std :: getline不插入换行符,因此源被读入一行;这当然是无效的。

0 个答案:

没有答案