让我的opengl程序运行一段时间并从不同角度查看场景后,我在着色器程序中收到OpenGL“无效值”错误。这就是我的计划:
顶点
#version 420
in vec4 Position;
uniform mat4 modelViewProjection;
void main()
{
in vec4 Position;
uniform mat4 modelViewProjection;
}
片段
#version 420
out vec4 fragment;
void main()
{
fragment = vec4(1,0,0,1);
}
在函数调用之后发生此错误,告诉OpenGL使用我的着色器程序。这可能是什么原因?无论我调用它的对象如何都会发生。如何获得有关正在发生的事情的更多信息?对于一系列帧,该错误几乎是随机发生的,但是一段时间后再次发生,稍后再次失败,等等。
如果有帮助,这就是我的程序链接的样子:
...
myShader = glCreateProgram();
CreateShader(myShader,GL_VERTEX_SHADER, "shaders/prog.vert");
CreateShader(myShader,GL_FRAGMENT_SHADER, "shaders/prog.frag");
glLinkProgram(myShader);
PrintProgramLog(myShader);
...
void CreateShader(int prog, const GLenum type, const char* file)
{
int shad = glCreateShader(type);
char* source = ReadText(file);
glShaderSource(shad,1,(const char**)&source,NULL);
free(source);
glCompileShader(shad);
PrintShaderLog(shad,file);
glAttachShader(prog,shad);
}
这就是我用来获取错误的内容:
void ErrCheck(const char* where)
{
int err = glGetError();
if (err) fprintf(stderr,"ERROR: %s [%s]\n",gluErrorString(err),where);
}
以下是我正在打印的内容:
ERROR: invalid value [drawThing]
在我打电话使用该程序后会发生:
glUseProgram(_knightShaders[0]);
ErrCheck("drawThing");
或glGetUniformLocation:
glGetUniformLocation(myShader, "modelViewProjection");
ErrCheck("drawThing2");
答案 0 :(得分:0)
所以我解决了这个问题。我上面所说的不是全部真相,我实际拥有的是
myShader[0] = glCreateProgram();
myShader是一个包含4个GLuint的数组,每个int都是一个不同的着色器程序(尽管此时它们都是我在上面发布的着色器程序的副本)。当我停止使用数组而不是使用:
时,问题得到解决GLuint myShader0;
GLuint myShader1;
GLuint myShader2;
GLuint myShader3;
为什么修复这个问题对我没有意义,它也是非常好的因为而不是能够索引我想要的着色器模式,例如:
int mode = ... (code the determine what shader to use here)
glUseProgram(myShader[mode]);
我必须使用条件:
int mode = ... (code the determine what shader to use here)
if (mode == 0) glUseProgram(myShader0);
else if (mode == 1) glUseProgram(myShader1);
else if (mode == 2) glUseProgram(myShader2);
else glUseProgram(myShader3);
如果有人知道为什么这样可以解决问题,我非常感谢这些知识!