2015-09-15 33 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

光照貼圖像素 –

相關問題