我正在制作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;
}
感谢您的答案,但至少我可以访问纹理当前像素,因为对于多个灯光他们应该混合。 –
我不明白你称之为“纹理”吗?你是在谈论你的场景像素还是光掩模像素或其他东西?此外,在考虑多个灯之前,我们先让这个工作为一个灯... –
光照贴图像素 –