2015-09-15 32 views
2

我正在制作2D游戏,我想制作一个光罩。到目前为止,我制作了一个帧缓冲区,在那里我拿着我的面具,但是我无法在其上应用着色器。当我不使用着色器时,光照贴图被正确绘制(没有场景,所以对于此代码,我绘制了一个带有一个白色矩形的黑色屏幕),但是当我尝试将它与场景混合时,它只会绘制黑色屏幕。这是我如何绘制帧缓冲区并应用着色器。如何使用着色器绘制FBO lwjgl

//draw scene 

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_frameBufferObject);//enable frame buffer 
      glPushAttrib(GL_VIEWPORT_BIT); 
      glViewport(0, 0, 1920, 1080); 
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

      //fill with black 
      glColor3f(0.0f, 0.0f, 0.0f); 
      glBegin(GL_QUADS); 
       glVertex2f(0, 0); 
       glVertex2f(1920, 0); 
       glVertex2f(1920, 1080); 
       glVertex2f(0, 1080); 
      glEnd(); 

      //example light, a rectangle trough which i should see the scene 
      glColor3f(1.0f,1.0f,1.0f); 
      glBegin(GL_QUADS); 
       glVertex2f(100, 100); 
       glVertex2f(300, 100); 
       glVertex2f(300, 300); 
       glVertex2f(100, 300); 
      glEnd(); 

      //Deactivate the framebuffer object 
      glPopAttrib(); 
      glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 

      glUseProgram(shaderProgram3);//this is the shader program 
      //Render the framebuffer object to the screen 

      glEnable(GL_TEXTURE_2D); 
      glBindTexture(GL_TEXTURE_2D, m_frameBufferTexture); 
       glBegin(GL_QUADS); 
        glTexCoord2f(0f, 0f); 
        glVertex2f(0, 0); 
        glTexCoord2f(1f, 0f); 
        glVertex2f(1920, 0); 
        glTexCoord2f(1f, 1f); 
        glVertex2f(1920, 1080); 
        glTexCoord2f(0f, 1f); 
        glVertex2f(0, 1080); 
       glEnd(); 
      glDisable(GL_TEXTURE_2D); 
      glUseProgram(0); 

    Display.update(); 
    Display.sync(60); 

这是着色器

uniform sampler2D backbuffer; 

void main(void) {  
    vec2 position; 
    position.x = gl_FragCoord.x/1920; 
    position.y = gl_FragCoord.y/1080; 
    vec4 color = texture2D(backbuffer, position); 
    gl_FragColor.x -=1-color.x; 
    gl_FragColor.y -=1-color.y; 
    gl_FragColor.z -=1-color.z; 
} 

回答

2

当你做你的着色器下面:

gl_FragColor.x -=1-color.x; 
gl_FragColor.y -=1-color.y; 
gl_FragColor.z -=1-color.z; 

我们假定你是,当你进入main()gl_FragColor包含了当前像素颜色当前帧缓冲区。

但事实并非如此! gl_FragColor是你需要在着色器中设置的颜色,直到你设置它的值,它的值将是未定义的(在你的情况下它似乎设置为黑色),它将永远不会包含“当前帧缓冲区颜色”(检查规格,这适用于所有版本的OpenGL/OpenGLES,对此没有例外)。

要获得当前帧缓冲区颜色,您需要为移动GPU使用OpenGL扩展,如EXT_shader_framebuffer_fetch,可悲的是这种扩展对于桌面GPU不存在(但您可以使用OpenGL4中的Image Load Store)。

但是这里我离题了,因为我不认为你需要任何这些扩展名,你需要的仅仅是在渲染你的掩码时启用blending,并正确配置混合公式以达到你的效果。

+0

感谢您的答案,但至少我可以访问纹理当前像素,因为对于多个灯光他们应该混合。 –

+0

我不明白你称之为“纹理”吗?你是在谈论你的场景像素还是光掩模像素或其他东西?此外,在考虑多个灯之前,我们先让这个工作为一个灯... –

+0

光照贴图像素 –

相关问题