我正在製作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;
}
感謝您的答案,但至少我可以訪問紋理當前像素,因爲對於多個燈光他們應該混合。 –
我不明白你稱之爲「紋理」嗎?你是在談論你的場景像素還是光掩模像素或其他東西?此外,在考慮多個燈之前,我們先讓這個工作爲一個燈... –
光照貼圖像素 –