OGLTools,OpenGL 编程的 OOP 解决方案






4.43/5 (11投票s)
2002年7月16日
3分钟阅读

121215

3474
一组旨在简化 OpenGL 编程的类
引言
本文介绍了一组帮助类,这些类封装了 OpenGL 处理,真正使程序员的生活更轻松(也更快乐)。
这段代码最初由 W.Weyna 'Voytec' 编写。 我所做的只是将其发布到 CodeProject。
以下是该软件包的主要功能
- GL 上下文创建和销毁,
- 双缓冲支持(当然),
- 渲染到位图(哇,这是个不错的功能),
- 导出到剪贴板、jpeg、bmp、dib,
- 纹理加载和管理,
主要类:CWGL
CWGL
是一个 Windows OpenGL 渲染接口类。 这个头文件还定义了一些接口 wgl_
内联函数。
CWGL
背后的想法是尽可能地简化在 Microsoft Windows 中使用 OpenGL。
在 Windows 下,在一个线程中只能有一个 OpenGL 渲染上下文处于活动状态。 CWGL
帮助您编写一个单线程 Windows 应用程序,该应用程序需要多个 OpenGL 渲染上下文。
用法
- 如果您对
CWGL
的默认像素格式不满意,可以选择设置不同的像素格式。 - 启用 OpenGL,告诉它应该在哪里渲染。
wgl.Begin(&windowOrBitmapDC);
- 调用 OpenGL API 函数进行渲染。
- 禁用 OpenGL,首先可以选择显示渲染的图像。
wgl.End();
示例
- 在 MFC 视图中,渲染到窗口的后备缓冲区并交换缓冲区。
// CView.h CWGL m_wgl;
// CView.cpp CView::OnDraw(pDC) { m_wgl.Begin(pDC); glClearColor(1.0, 1.0, 1.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); m_wgl.End(); }
- 在 DIB 段 GDI 对象上渲染并将其复制到剪贴板。
CRGBSurface tmpSurf; // CRGBSurface encapsulates a DIB section GDI object 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();
- 如果使用不同的
CWGL
对象,则渲染上下文可以“嵌套”,但请记住,一个窗口只能创建一个 RC。wgl1.Begin(&windowDC); { CWGL wgl2; wgl2.Begin(&bitmapDC); wgl2.End(); // here wgl2 destructor delete's wgl2 RC and makes // wgl1 RC current again. } // here all the display lists and textures of wgl1 RC // remain valid wgl1.End();
- 如果您需要一个窗口的 RC,但您不再有可用的设备上下文,您可以调用
wgl.Begin()
,而不使用 DC,以使该窗口的上次使用的 RC 再次变为当前。wgl.Begin(&windowDC); wgl.End(); ... // some time in the future... wgl.Begin(); wgl.End();
- 在调用
CWGL::End()
之后,您可以询问渲染时间GetRenderingTime()
。
注释
在不同的 DIB 段或位图上渲染时,总是为该位图创建一个新的具有PFD_DRAW_TO_BITMAP
像素格式的 RC。
WindowsNT:CWGL
自动同步 GDI 和 OpenGL 对渲染表面的访问。
当使用CWGL
切换不同像素格式的 RC 时,必须在新 RC 中重新创建所有纹理和显示列表。 当 RC 具有相同的像素格式时,显示列表共享是可能的(这也意味着您不能在窗口和位图 RC 之间共享)。
另请注意,在 Windows 下,只能为一个给定的窗口创建一个 RC,并且此 RC 不能用于另一个窗口。
使用纹理
CGLTexture
是 OpenGL 纹理对象的简单包装器。 它能够轻松更改纹理图像,并在可能的情况下重用现有纹理对象。
- 调用
ChangeImage
来创建/重新创建/重用纹理,并将CGLImage
图像复制到纹理对象。 - 使用
Bind()
来绑定纹理。 - 在切换到新 RC 之前使用
Invalidate()
。 如果调用Invalidate()
,然后在新的 RC 中调用Bind()
,则将使用图像的备份副本自动重新创建纹理。 - 如果您不打算在多个 RC 中使用相同的纹理,请调用
ChangeImage()
,并将第二个参数设置为false
,这样它就不会制作不必要的图像备份副本。if(bChangeImage) { // Handle a request to use a different image // for texture. bChangeImage = false; CGLImage glImage; glImage.Create(m_strNewImageFilePath, GL_RGBA); m_tex1.ChangeImage(&glImage, false); } m_tex1.Bind();
- 使用
Coordn()
函数生成纹理坐标,该坐标指向可能更大的纹理中当前子图像的四个角。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);
更多示例和文档
已经生成了类的文档,并且可以随源代码一起分发。
在您的应用程序中使用该库
- 在您的StdAfx.h中包含 OGLTools 头文件
#include "OGLT.h"
- 确保.h和.lib可用,如果不可用,请将相应的目录添加到项目设置中。
- 就这样,lib 会自动插入。