我想实现上帝的光线,并为我呈现我的星球以及太阳下采样纹理与太阳为白色和地球为黑色,这样当行星遮挡太阳,只有可见的部分在下一个通道中变得模糊。莫名其妙的错误,而在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第二时间的价值,我得到的错误代码1282做glUniform1i调用之后。结果,两个球体都变成了白色。我想要的是较小的球体(太阳)是白色的,但是较大的球体(星球)是黑色的。据我所知,这是一个无效值错误,这意味着着色器认为传递的值不是整数。但很显然,我确切地声明我的价值是一个整数。
我也试图与设定值isSun的颜色值:
gl_FragColor = vec4(isSun, isSun, isSun, 1.0);
但我得到的是白色的,这意味着isSun的值不会得到更新。
任何人都可以解释什么可能是这里的问题?为什么isSun没有得到更新?
这样的任务是推动我疯了的简单!
片段着色器中没有'out'变量,将颜色传递给管道中的下一个步骤 – Pierre