2016-02-05 85 views
-1
设置一个简单的统一

我想实现上帝的光线,并为我呈现我的星球以及太阳下采样纹理与太阳为白色和地球为黑色,这样当行星遮挡太阳,只有可见的部分在下一个通道中变得模糊。莫名其妙的错误,而在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); 
} 

这里的我得到的一些截图:

enter image description here enter image description here

正如渲染代码解释说,当我尝试设置的isSun第二时间的价值,我得到的错误代码1282做glUniform1i调用之后。结果,两个球体都变成了白色。我想要的是较小的球体(太阳)是白色的,但是较大的球体(星球)是黑色的。据我所知,这是一个无效值错误,这意味着着色器认为传递的值不是整数。但很显然,我确切地声明我的价值是一个整数。

我也试图与设定值isSun的颜色值:

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

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

任何人都可以解释什么可能是这里的问题?为什么isSun没有得到更新?

这样的任务是推动我疯了的简单!

+0

片段着色器中没有'out'变量,将颜色传递给管道中的下一个步骤 – Pierre

回答

3

你是否已经看到Opengl shader error 1282

根据这个链接,错误1282可以来自很多东西。作为@mikyra建议:

  • 试图调用gluErrorString()以获得更详细的错误
  • 确保您的着色器的程序仍然在使用(我们不知道你在ss->render(curr_program, textureManager)也许打电话给在做什么glUseProgram(0)
+0

嗯,我会被诅咒!在我的渲染函数中,最后一行是glUseProgram(0)。我现在只觉得很愚蠢。感谢您指出了这一点!这解决了我的问题!再次感谢。 – pslayer89