65.9K
CodeProject 正在变化。 阅读更多。
Home

OGLTools,OpenGL 编程的 OOP 解决方案

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.43/5 (11投票s)

2002年7月16日

3分钟阅读

viewsIcon

121215

downloadIcon

3474

一组旨在简化 OpenGL 编程的类

Sample Image - ogltools.jpg

引言

本文介绍了一组帮助类,这些类封装了 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();

示例

  1. 在 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();
    }
  2. 在 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();
  3. 如果使用不同的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(); 
  4. 如果您需要一个窗口的 RC,但您不再有可用的设备上下文,您可以调用wgl.Begin(),而不使用 DC,以使该窗口的上次使用的 RC 再次变为当前。
    wgl.Begin(&windowDC);
    wgl.End(); 
    ...
    
    // some time in the future...
    wgl.Begin();
    wgl.End();
  5. 在调用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);

更多示例和文档

已经生成了类的文档,并且可以随源代码一起分发。

在您的应用程序中使用该库

  1. 在您的StdAfx.h中包含 OGLTools 头文件
    #include "OGLT.h"
  2. 确保.h.lib可用,如果不可用,请将相应的目录添加到项目设置中。
  3. 就这样,lib 会自动插入。
© . All rights reserved.