Introduction
This article presents a set of helper classes that encapsulates OpenGL handling and really makes the programmer's life easier (and happier).
This piece of code was originally been written by W.Weyna 'Voytec'. All I did was to publish it to CodeProject.
Here are the main features of the package:
- GL context creation and destruction,
- Double buffering support (of course),
- Rendering to bitmap (Woww that's nice feature),
- Export to clipboard, jpeg, bmp, dib,
- Texture loading and management,
The main class: CWGL
CWGL
is a Windows OpenGL rendering interface class. This header defines also a few interfacing wgl_
inlines.
The idea behind the CWGL
is to make use of OpenGL in Microsoft Windows as simple as possible.
Under Windows only one OpenGL rendering context may be active in a single thread. CWGL
helps you write a single threaded Windows application which need more than one OpenGL rendering context.
Usage:
Examples:
- In MFC view, render to window's backbuffer and swap buffers.
CWGL m_wgl;
CView::OnDraw(pDC)
{
m_wgl.Begin(pDC);
glClearColor(1.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
m_wgl.End();
}
- Render on DIB section GDI object and copy it to clipboard.
CRGBSurface tmpSurf;
tmpSurf.Create(10, 10);
CWGL wgl;
wgl.Begin(tmpSurf.GetDC());
glClearColor(1.0, 1.0, 1.0, 0.0)
glClear(GL_COLOR_BUFFER_BIT);
wgl.End();
tmpSurf.CopyToClipboard();
- Rendering contexts may be 'nested' if different
CWGL
objects are used, but remember that only one RC can be created for one window. wgl1.Begin(&windowDC);
{
CWGL wgl2;
wgl2.Begin(&bitmapDC);
wgl2.End();
}
wgl1.End();
- If you need an RC for a window for which you no longer have a device context available, you may call
wgl.Begin()
with no DC to make last used RC of this window current again. wgl.Begin(&windowDC);
wgl.End();
...
wgl.Begin();
wgl.End();
- After a call to
CWGL::End()
you may ask what the rendering time was with GetRenderingTime()
.
Notes:
When rendering on different DIB sections or bitmaps, a new RC with PFD_DRAW_TO_BITMAP
pixelformat is always created for that bitmap.
WindowsNT: CWGL
synchronizes GDI and OpenGL access to rendering surface automatically.
When switching RC's of different pixelformats with CWGL
, all textures and display lists must be recreated in a new RC. Display list sharing is possible when RCs are of the same pixelformat (this means also that you cannot share between window and bitmap RC).
Please also note that under Windows, only one RC may be created for a given window and this RC cannot be used for another window.
Working with textures:
CGLTexture
is a simple wrapper to OpenGL texture object. It enables easy changing of texture images, reusing existing texture object when possible.
- Call
ChangeImage
to create/recreate/reuse a texture and copy CGLImage
image to the texture object.
- Use
Bind()
to bind a texture.
- Use
Invalidate()
before switching to a new RC. If Invalidate()
is called and then Bind()
is called in a new RC, the texture will be automatically recreated using a backup copy of the image.
- If you are not going to use the same texture in multiple RC's, call
ChangeImage()
with second parameter set to false
so it won't make unnecessary backup copy of the image. if(bChangeImage)
{
bChangeImage = false;
CGLImage glImage;
glImage.Create(m_strNewImageFilePath, GL_RGBA);
m_tex1.ChangeImage(&glImage, false);
}
m_tex1.Bind();
- Use
Coordn()
function to generate texture coordinates which point to the four corners of current subimage inside a possibly larger texture. glBegin(GL_QUADS);
m_tex1.Coord0(); glVertex3f(-5.0, -5.0, 0.0);
m_tex1.Coord1(); glVertex3f(-5.0, 5.0, 0.0);
m_tex1.Coord2(); glVertex3f(5.0, 5.0, 0.0);
m_tex1.Coord3(); glVertex3f(5.0, -5.0, 0.0);
glEnd();
glFlush();
glDisable(GL_TEXTURE_2D);
More examples and Doc
A documentation of the classes has been generated and is available with the source code distribution.
Using the library in your app
- Include the OGLTools header in your StdAfx.h:
#include "OGLT.h"
- Make sure the .h and .lib are available, if not add the corresponding directories to the project settings.
- That's it, the lib's will be automatically inserted.