在 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)
)
我正在尝试实现上帝射线,为此我将我的星球和太阳渲染为一个降采样纹理,其中太阳为白色,行星为黑色,这样当行星遮挡太阳时,只有部分可见的会在下一次通过时变得模糊。
这是我的渲染循环中代码的高级版本:
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)
)