在 OpenGL 中设置简单制服时出现莫名其妙的错误

Inexplicable error while setting a simple uniform in OpenGL

我正在尝试实现上帝射线,为此我将我的星球和太阳渲染为一个降采样纹理,其中太阳为白色,行星为黑色,这样当行星遮挡太阳时,只有部分可见的会在下一次通过时变得模糊。

这是我的渲染循环中代码的高级版本:

curr_program = sun_program;
glUseProgram(curr_program);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);

cam->setupCamera(curr_program);

float white[3] = { 1.f, 1.f, 1.f };
float black[3] = { 1.f, 0.f, 0.f };

GLuint isSunLocation = glGetUniformLocation(curr_program, "isSun");
int value = 1;
cout << "1: " << glGetError() << endl; // output: 0
glUniform1i(isSunLocation, value);
cout << "2: " << glGetError() << endl; // output: 0
ss->render(curr_program, textureManager);
value = 0;
cout << "3: " << glGetError() << endl; // output: 0
glUniform1i(isSunLocation, value);
cout << "4: " << glGetError() << endl; // output 1282
s->render(curr_program, textureManager);

这是我的顶点着色器:

#version 400 core

in vec3 vPosition;

uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;

void main()
{
    mat4 modelView = view * model;
    gl_Position = projection * modelView * vec4(vPosition, 1.0);
}

这是我的片段着色器:

#version 400 core

uniform int isSun;

void main()
{
    gl_FragColor = vec4(isSun, isSun, isSun, 1.0);
}

这是我得到的一些屏幕截图:

如渲染代码中所述,当我第二次尝试设置 isSun 的值时,在执行 glUniform1i 调用后得到错误代码 1282。结果,两个球体都变成了白色。我想要的是较小的球体(太阳)是白色的,而较大的球体(行星)是黑色的。据我了解,这是一个无效值错误,这意味着着色器认为传递的值不是整数。但很明显,为了保险起见,我将我的值专门声明为一个整数。

我还尝试将 isSun 值设置为颜色值:

gl_FragColor = vec4(isSun, isSun, isSun, 1.0);

但我得到的只是白色,这意味着 isSun 的值没有得到更新。

谁能解释一下这可能是什么问题?为什么 isSun 没有更新?

像这样最简单的任务都快把我逼疯了!

你看过Opengl shader error 1282了吗?

根据这个 link,错误 1282 可能来自许多方面。正如@mikyra 建议的那样:

  • 尝试调用 gluErrorString() 以获得更详细的错误
  • 确保您的着色器程序仍在使用中(我们不知道您在 ss->render(curr_program, textureManager) 中正在做什么,也许是调用 glUseProgram(0)