How to put a semi-opaque layer on a frame?
Usually when clearing the frame for a new draw, one uses the glClear()
or glClearColor()
. But each of those completely removes the previous frame.
I'd like to make the frames disappear gradually, i.e. with each n开发者_JAVA百科ew frame put a semi-transparent overlay on what's already on the canvas. I tried to use the glClearColor()
's alpha parameter, but it doesn't seem to have any effect.
What should I do to achieve this gradual disappearing effect?
If you just want to draw the clear color over the last frame without getting rid of it entirely, draw a screen-size quad over the viewport with the same color as what you'd pass to glClearColor
, and skip calling glClear(GL_COLOR_BUFFER_BIT)
(you should probably still clear the depth/stencil buffers if you're using either of them). So, if you're using a depth buffer, first clear the depth buffer if need be, disable depth testing (this is important mainly to make sure that your quad does not update the depth buffer), draw your screen-size quad, and then re-enable depth testing. Draw anything else afterward if you need to.
What follows assumes you're using OpenGL ES 2.0
If you need to blend two different frames together and you realistically never actually see the clear color, you should probably render the last frame to a texture and draw that over the new frame. For that, you can either read the current framebuffer and copy it to a texture, or create a new framebuffer and attach a texture to it (see glFramebufferTexture2D
). Once the framebuffer is set up, you can happily draw into that. After you've drawn the frame into the texture, you can go ahead and bind the texture and draw a quad over the screen (remembering of course to switch the framebuffer back to your regular framebuffer).
If you're using OpenGL ES 1.1, you will instead want to use glCopyTexImage2D
(or glCopyTexSubImage2D
) to copy the color buffer to a texture.
精彩评论