在我开始之前。我的着色器程序成功链接,以及所有链接的单元 编译成功。
所以,我有一个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.所以问题是以某种方式与该调用有关。我不太明白的一个怪癖是如果我给程序提供一些几何 它会以某种方式设法实际呈现它,只是不使用我的着色器。
我很困惑,任何帮助或建议都会受到赞赏。
编辑:
作为后续行动。出于某种原因,我认为0是真的,叹息。使用GL_TRUE(1)导致我的错误处理代码实际显示错误。
在阅读着色器时我犯了同样的错误:glsl shader compilation issue at runtime
std :: getline不插入换行符,因此源被读入一行;这当然是无效的。