【问题标题】:Invalid value GLSL?GLSL 值无效?
【发布时间】: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 不应该编译。如果奇迹发生了,那么你就没有活跃的制服或属性;因此,您尝试按名称查询的任何内容都将没有位置。你的着色器/程序信息日志有什么要说的吗?

标签: opengl graphics glsl


【解决方案1】:

所以我解决了这个问题。我上面所拥有的并不是全部真相,我实际上拥有的是

myShader[0] = glCreateProgram();

myShader 是一个包含 4 个 GLuint(s) 的数组,每个 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);

如果你们中的任何人知道为什么这可以解决问题,我将非常感谢您的知识!

【讨论】:

  • 如果不展示相关的源代码,你的原始程序中发生了什么是不可能的。
  • 如果您有一个由 4 个 id 或 4 个单独变量组成的数组,这并没有什么不同。一定有其他事情发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2014-12-03
  • 2021-07-04
  • 1970-01-01
相关资源
最近更新 更多