GLSL值无效?

时间:2014-05-24 22:45:30

标签: opengl graphics glsl

让我的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");

1 个答案:

答案 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);

如果有人知道为什么这样可以解决问题,我非常感谢这些知识!