【发布时间】:2014-05-25 08:50:01
【问题描述】:
让我的 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");
【问题讨论】:
-
你能把出错的那一行贴出来吗?是直接打电话给
glUseProgram()吗?我没有看到对glGetError()的任何呼叫。你是在每次 OpenGL 函数调用之后调用它吗? OpenGL 中的错误是粘性的,如果您没有定期收到错误,它会一直存在,直到您调用glGetError()。这让我过去很失望。似乎错误来自特定函数,但事实证明它发生得更早,我只是没有检查它。 -
您的顶点着色器代码看起来不合理。对我来说,这看起来像是一个 Copy'n'Paste 小插曲。
-
嗯,你能详细说明一下 datenwolf 吗?它有什么问题?
-
你在哪里设置
gl_Position?为什么要在 main 中第二次声明变量? -
如果那是字面意思你的程序,VS 不应该编译。如果奇迹发生了,那么你就没有活跃的制服或属性;因此,您尝试按名称查询的任何内容都将没有位置。你的着色器/程序信息日志有什么要说的吗?