在C++ Builder中使用OpenGL编程的优化框架

姑且不谈论OpenGL的名贵背景和光明前途,单凭其实用性和有效性就足以使其成为我们图形输出编程的首选。但是在实际工程应用中程序员没必要仔细地深究OpenGL的运作机制,也往往不需要掌握各种高级的效果制作,真正需要的是最简捷地利用这个得力的工具实现输出数据的可视化,如波形、谱图、立体统计图表等的显示。有鉴于此,本文总结出了在C++Builder中OpenGL编程的实用框架。笔者经过实践,对于一般的图形输出的应用,此框架足以应付。对于复杂些的程序可以在本框架的基础上进行扩充。

在Windows环境下用OpenGL编程至少要了解如下预备知识:

OpenGL本身:对于一般的应用,我们可以认为OpenGL就是一套与窗口系统和操作系统无关的三维图形函数库。

DC和RC:每个Win32应用程序都有一个设备描述表(Device Context)简称DC,在这个设备描述表中包含了图形怎样显示在窗口的设置( GDI)信息。调用OpenGL函数必须使用设备描述表才能正确地在窗口输出。图形操作描述表(Rendering Context)简称RC,是一种设备描述表的形式,在图形操作描述表中存放一些OpenGL和操作系统相联系的信息。图形操作描述表是传递所有OpenGL命令的端口。

像素格式:像素格式定义了OpenGL绘图的属性,创建图形操作描述表首先要定义象素格式。它由这样一个数据结构实现

typedef struct tagPIXELFORMATDESCRIPTOR
{
WORD nSize; //结构大小
WORD nVersion; //版本
DWORD dwFlags; //象素缓冲的位标志
BYTE iPixelType; //RGBA模式或颜色索引模式
BYTE cColorBits; //颜色位数
BYTE cRedBits; //RGBA模式下R所占位数
BYTE cRedShift; //RGBA模式下R位数偏移
BYTE cGreenBits; //RGBA模式下G所占位数
BYTE cGreenShift; //RGBA模式下G位数偏移
BYTE cBlueBits; //RGBA模式下B所占位数
BYTE cBlueShift; //RGBA模式下B位数偏移
BYTE cAlphaBits; //RGBA模式下Alpha所占位数
BYTE cAlphaShift; //RGBA模式下Alpha位数偏移
BYTE cAccumBits; //累计缓冲区位面总数
BYTE cAccumRedBits; //累计缓冲区R位面总数
BYTE cAccumGreenBits; //累计缓冲区G位面总数
BYTE cAccumBlueBits; //累计缓冲区B位面总数
BYTE cAccumAlphaBits; //累计缓冲区Alpaha位面总数
BYTE cDepthBits; //深度缓冲位数
BYTE cStencilBits; //模板缓冲位数
BYTE cAuxBuffers; //Win32 下不支持
BYTE iLayerType; //不再使用
BYTE bReserved; //0
DWORD dwLayerMask; //不再使用
DWORD dwVisibleMask; //0
DWORD dwDamageMask; //不再使用
} PIXELFORMATDESCRIPTOR; 

双缓冲技术:OpenGL支持一个显示缓冲和一个非显示缓冲。缺省的情况是所有的OpenGL绘制命令在非显示缓冲中绘制,绘制完成后再将其内容拷贝到显示缓冲区中(使用SwapBuffers函数)。双缓冲使图象转换更平滑,这就是在快速动画(如波形等的实时输出)时没有屏幕闪烁的奥妙所在。

反走样技术:实际中需要画出的往往是曲线,由于计算机以离散点生成图形,曲线上会有锯齿,这就是一种走样现象。在用一般语言画图时,这一现象是难以避免的。OpenGL中利用混合技术,把原来边界的锯齿部分用低饱和度的点补上从而实现反走样,达到平滑的边界效果。

好,我们现在可以启用下面的程序框架了。

在*.h文件的类声明中添加private成员:

private:

HGLRC hRC;

HDC hDC;

以下是相应*.cpp文件

首先加上两个包含文件:

#include <gl\gl.h> //程序使用OpenGL的核心函数

#include <gl\glu.h> //程序使用实用库中的函数

时间: 2024-11-03 10:49:44

在C++ Builder中使用OpenGL编程的优化框架的相关文章

在 C++ Builder中利用串行通信控件编程

摘要:串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.本文介绍了在C++ Builder中如何利用串行通信控件进行串行通信编程. 一.引言 目前,在用计算机进行数据传输时,常用的是串行通信方式.用C++ Builder来编写串行通信程序时,可以调用Windows API函数,也可以利用VB中的MSComm控件. 利用 API函数编写实际应用程序时,往往要考虑多线程的问题,这样编出来的程序不但十分庞大,而且结构比较复杂,继承性差,维护困难.但是使用串行通信控

C++ Builder中如何保持控件的位置及大小

C++ Builder/Delphi是Inprise(原Borland)公司广受欢迎的可视化C++/Pascal开发工具,利用它可极大地加快应用程序的开发速度.但是,也正因为其是可视化编程工具,将控件拖放到Form后,控件的位置就固定死了.随着Form的大小或屏幕分辨率的改变,控件和Form本身的位置往往变得非常混乱.本文将介绍一些正确定位控件及Form的方法. 利用OnResize事件改变控件位置及大小 C++ Builder/Delphi中的Form控件有一个OnResize事件,Form的

C++ Builder与Matlab混合编程的实现

在C++Builder中调用Matlab工具箱函数,有两种实现方式.一种是基于Matlab环境支持,通过必要的设置实现:笔者在本刊上曾撰文对这种方式进行了专门的阐述.另一种则是完全脱离Matlab环境,通过动态连接库方式实现对Matlab工具箱函数的调用,这可以通过一种开发平台Mediva来实现.相对来说,前者的限制因素较多,而后者则较为方便灵活. 一.Mediva软件平台 Mediva是Mathtools公司推出的一种Matlab编译开发软件平台,提供对Matlab程序文件(M文件)的解释执行

C++ Builder中保持控件的位置及大小

C++ Builder/Delphi是Inprise(原Borland)公司广受欢迎的可视化C++/Pascal开发工具,利用它可极大地加快应用程序的开发速度.但是,也正因为其是可视化编程工具,将控件拖放到Form后,控件的位置就固定死了.随着Form的大小或屏幕分辨率的改变,控件和Form本身的位置往往变得非常混乱.本文将介绍一些正确定位控件及Form的方法. 利用OnResize事件改变控件位置及大小 C++ Builder/Delphi中的Form控件有一个OnResize事件,Form的

C++Builder中实现控件数组的功能

Borland C++ Builder作为Inprise(原Borland)公司新推出的快速应用程序开发工具(RAD),具有威力强大的C++语言和快捷便利的可视化编程完美结合的优点,遗憾的是其没有直接提供像VB中的控件数组的功能,需要开发者自己编程实现. VB中的一个控件数组可以 允许多个控件共享同一个事件句柄 提供了运行期间增加一个控件的机制 提供了一种方便的组合控件的方法. 前两项在C++ Builder中早已实现,而且CB更有一个优点.即不同类型的控件可以使用相同的句柄(只需在相关控件的O

Report Builder中占位列的使用

Report Builder中的列类型包括公式列.汇总列.占位列等.一般公式列.汇总列用的比较多,这里不再详述.下面主要讲占位列的一种使用方法. 日前做的应用中,需要20个公式列来取值,而每个公式列都使用同样from.where子句的sql语句,唯一区别在于所取的字段不同.这样需要20次的读取数据库操作,速度比较慢.一开始考虑再使用一个query来做,但是又没有明确的连接关系,无法达到目的. 最后决定研究一下占位列,具体的过程不再赘述,介绍一下实现方法. 1.首先建立一个公式列,19个占位列,分

OpenGL编程轻松入门之背景简介

OpenGL(Open Graphics Library)是图形硬件的一个软件接口,也是该领域的工业标准.图形程序员利用这些指令可以创建高质量的交互式的三维应用.OpenGL的前身是SGI(Silicon Graphics)公司为其图形工作站开发的IRIS GL.IRIS GL虽然功能强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL. OpenGL是一个与硬件无关的软件接口.可以在不同的平台如Windows 95.Windows NT.Unix.Linux.MacO

《基于MFC的OpenGL编程》Part 19 Creating a Virtual Reality Walkthrough…

<基于MFC的OpenGL编程>Part 19 Creating a Virtual Reality Walkthrough Application 本文是整个系列文章的最后一篇,将创建一个完整的虚拟office应用程序(如图所示)来做为ending. 1,在CCY457OpenGLView类中加入下述变量,用来保存office内各个物体的显示列表 //Display List Names GLuint m_SceneList; GLuint m_ComputerList; GLuint m_

《基于MFC的OpenGL编程》Part 2 Setting up OpenGL on Windows

WGL – Windows的 OpenGL扩展层 The WGL extension consists of a set of functions (wglCreateContext, wglDeleteContext etc.) and structures (such as PIXELFORMATDESCRIPTOR, GLYPHMETRICSFLOAT) etc. Thus every OpenGL implementation has a platform-specific portio