Rendering layers of bitmaps with alpha to FBO - opengl

I need to draw several "layers" of bitmaps that are semi-transparent to a FBO (for later readback).
My current approach is to create a FBO, attach a texture to it and use glTexSubImage2D to "draw" the bitmaps to the FBO, this however, doesn't work as glTexSubImage2D doesn't draw/blend the pixels, but just overwrite the pixels currently in the texture.
What's the best way to do this?

You create a FBO with a clean texture R attached to hold the final result.
For each of your bitmaps you:
Upload the bitmap to a texture T (T and and R are different textures).
Render a quad textured with T into the FBO with GL_BLEND enabled and properly set up.
The final result is that R holds your blended bitmaps. You can now read it back or use in other texturing operations.

Related

Premultiplied alpha and multisampling in OpenGL

I'm rendering some triangles into multisampled texture. Then blit this texture into normal texture and draw a textured quad onto screen.
I need the final texture to have premultiplied alpha. Is there a way to tell OpenGL to automatically premultiply semi-transparent pixels in multisampled texture (or when blitting)?
Or the only way is using an extra shader pass to perform multiplication manually?
A multisample resolve blit can't perform pre-multiplication. You will have to pre-multiply the texture's pixels in the process that reads from the texture.

OpenGL offscreen rendering

I was trying to render a 2D scene into a off-screen FrameBuffer Object and use glFrameBufferTexture2D function to use the frame as texture to texture a cube.
The 2D scene is rendered in one context and the texture is used in another one in the same thread.
The problem is when I textured the cube, alpha channel seemed to be incorrect. I used apitrace to check the texture, and the texture has correct alpha value, and the shader was merely out_color = texture(in_texture, uv_coords)
The problem was solved if I blit the off-screen framebuffer color attachment to anything, whether it be itself or framebuffer 0 (output window).
I was wondering why this is happening and how to solve it without needing to blit the framebuffer.
Found out that I used single buffering for the static 2D scene and requires a glFlush to flush the pipeline.

OpenGL: Copy irregular (non square) portion of source FBO to destination FBO

Im doing 2D rendering and I'm using FBOs. I need to copy irregular (non square) portion of source FBO to destination FBO.
Is there a way to achieve that by applying some mask?
What I'm doing now:
Copy part of main FBO to temp FBO.
Do some drawing on temp FBO.
glBlitFramebuffer temp FBO back to main FBO stretched.
So, as simplest example, i would like to take round part (or polygon) from main fbo do some drawings on it and blit it back stretched to main FBO. It is like round (or polygonal) magnification glass.
You can use a stencil mask. See this example from the OpenGL wiki: http://www.opengl.org/wiki/Stencil_Mask

What is faster? Framebuffer color attachment or full screen texture quad?

I want to draw fullscreen frames of a sequence, and switch between them fast. I saw that I could attach multiply color attachments to a framebuffer.
I'm wondering if it could be far cheaper to use renderbuffer attachments instead of the current textured quads method.
How can I switch between attachments by the way? Is there a maximum number of attachments?
I want to draw fullscreen frames of a sequence, and switch between them fast.
Drawing images always means uploading the data to a texture and drawing a quad using that texture. Look into Pixel Buffer Objects to implement asynchronous data upload and glTexStorage (OpenGL-4.2 feature) for how to bolt the memory layout down.
I saw that I could attach multiply color attachments to a framebuffer.
The framebuffers this applies to are off-screen framebuffer objects, and not the on screen framebuffer. I.e. this won't help you in any way.

Normal back buffer + render to depth texture in OpenGL (FBOs)

Here's the situation: I have a texture containing some depth values. I want to render some geometry using that texture as the depth buffer, but I want the color to be written to the normal framebuffer (i.e., the window's framebuffer).
How do I do this? I tried creating an FBO and only binding a depth texture to it (GL_DEPTH_COMPONENT) but that didn't work; none of the colors showed up.
No you can't. The FBO you are rendering to may be either a main framebuffer or an off-screen one. You can't mix them in any way.
Instead, I would suggest you to render to a color renderbuffer and then do a simple blitting operation into the main framebuffer.
Edit-1.
Alternatively, if you already have depth in the main FB, you can first blit your depth and then render to a main FB, thus saving video memory on the additional color renderbuffer.
P.S. Blitting is done via glBlitFramebuffer. In order to make it work you should setup GL_READ_FRAMEBUFFER, GL_DRAW_FRAMEBUFFER and glDrawBuffer() for each of them.