在OpenGL

时间:2016-02-05 08:16:29

标签: c++ opengl visual-c++ glsl shader

我正在努力实现上帝的光线,为此我将我的星球和太阳渲染为一个下采样纹理,太阳为白色,行星为黑色,这样当行星遮挡太阳时,只有部分是可见在下一遍中会变得模糊。

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

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);
}

以下是我获得的一些屏幕截图:

enter image description here enter image description here

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

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

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

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

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

像这样最简单的任务让我抓狂!

1 个答案:

答案 0 :(得分:3)

您是否已经看过Opengl shader error 1282

根据此链接,错误1282可能来自很多事情。正如@mikyra所说:

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