I am writing an opengl user interface for windows platforms. I need to create buttons, textboxes, scroolbars, etc. The problem is that I want each control to be 3D and independent from the contents of the window I render into.
One example should be the warcraft III user interface (with a shield, a flag and a sword redered as a backgroud and with buttons over those objects). I want a way to render the controls on top of what was previously rendered into the window.
Here is my solution:
-each control has a texture (or an area in a texture) associated with it. I render the object to the framebuffer and then glCopyTexSubImage it to its texture.
I render each object and copy it to its texture, then render the entire window and apply the controls as textured quads (with transparency).
I want to make the user interface work with mostly all the 3D cards so I don’t want to use extensions unless they are widely supported.
My solution is VERY fillrate limited because, for every object I do the following opperations:
- set all states as the object wants (not a fillrate limiter),
- I do a glScissor and a glClear to clear the framebuffer in order to draw the object
- I draw the object
- I glCopyTexSubImage the object to its texture
- I glBindTexture and apply a quad textured with the object
As you can see, besides drawing the object I also do the equivalent (more or less) of 3 glClear (glClear, glCopyTexSubImage and drawing the textured quad)
This implementation works as I want it to work, meaning that the controls have the same aspect no matter what projection matrix I have for the background and what I draw there.
However, I want to make it faster.
Do you have any ideas ?