我正在努力实现上帝的光线,为此我将我的星球和太阳渲染为一个下采样纹理,太阳为白色,行星为黑色,这样当行星遮挡太阳时,只有部分是可见在下一遍中会变得模糊。
这是我的渲染循环中代码的高级版本:
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没有更新?
像这样最简单的任务让我抓狂!答案 0 :(得分:3)
您是否已经看过Opengl shader error 1282?
根据此链接,错误1282可能来自很多事情。正如@mikyra所说:
gluErrorString()
以获得更详细的错误ss->render(curr_program, textureManager)
中正在做什么,可能会调用glUseProgram(0)
)