openGL使用方法教程

来源:互联网 发布:ftp server软件 编辑:程序博客网 时间:2024/05/22 07:47

 OpenGL是一个典型的、已经被接受的国际工业标准的三维图形软件包。严格地讲,OpenGL被定义为“图形硬件的一种软件接口”。从本质上说,它是一个3D图形和模型库,具有高度的可移植性,并且具有非常快的速度。OpenGL是API而不是编程语言。

        OpenGL特点:OpenGL是一个过程性的图形API,它并不是描述性的。事实上,程序员并不需要描述场景的性质和外观,而是事先确定实现一定的外观或效果所需要的一些操作步骤。这些步骤涉及到许多OpenGL命令的调用。这些命令可以在三维空间中绘制各种图元(点、直线和多边形等)。还支持光照、纹理贴图、混合、透明动画以及其他许多特殊的效果和功能。

        OpenGL特点:OpenGL不支持任何用于窗口管理、用户交互或文件I/O的函数。每个宿主环境(例如Microsoft indows)自己拥有一些函数,他们实现了这些功能,并且负责实现一些方法,向OpenGL递交窗口绘图的控制。

       OpenGL命令语法和规范:OpenGL包含了近200个函数,分为5类:
      核心函数:115个,以gl开头。 
      实用函数:43个,以glu开头。
      辅助函数:31个,以aux开头。
     专用函数:6个,以wgl开头。
      Win32API函数:5个,无特定前缀。核心函数命名规则为:以前缀gl开头,组成命令名的每个字的开头用大写字母。例如:glClearColor()。
OpenGL命令语法和规范:OpenGL定义的符号常数以GL_开头,全部用大写字母,各个字之间用下划线分割。例如:GL_COLOR_BUFFER_BIT

OpenGL定义的数据类型以GL开头。

        字符数据类型相应与C的数据类型OpenGL中定义s 16位整数short GLshorti 32位整数int GLintf 32位浮点数float GLfloatd 64位浮点数double GLdouble。例如:void glVertex<n>{sifd}[v](TYPE x,type Y)TYPE 为sifd数据类型中的一个。n 说明命令参数的个数,可以为2或3。v 指定命令为向量形式。Windows环境下OpenGL的编程方法在Windows环境下进行OpenGL的编程时,需要对Windows窗口进行专门的设置。设置方法有多种。使用辅助库glaux的方法。使用GDI和WGL函数的方法。使用OpenGL实用函数库glut的方法。

OpenGL与Windows的绘图方式是不同的,其区别主要表现在以下三个方面:Windows用GDI绘图。OpenGL用图形操作描述表(着色描述表、绘制描述表)(Rendering Contexts)绘图。OpenGL使用特殊的像素格式。

在Windows 95/98/NT下,窗口程序必须首先处理设备描述表(Device Contexts,简称DC),DC包括如何在窗口上显示图形的信息。OpenGL for Windows 的程序也必须使用DC,而且必须处理特殊的DC图形操作描述表,这是DC中专为OpenGL使用的一种功能。

一个OpenGL应用图形操作描述表内有OpenGL与Windows 窗口系统相关的各种信息,必须先创建一个图形操作描述表(Rendering Context),然后启动它,按常规方式调用OpenGL的函数绘制图形,最后销毁它。

Windows提供了5个函数管理图形操作描述表。这5个函数都有前缀“wgl”,各函数的功能如下所示。wglCreateContext() 建立一个图形操作描述表wglDeleteContext() 删除一个图形操作描述表wglGetCurrentContext() 得到当前的图形操作描述表
wglGetCurrentDC() 得到当前与图形操作描述表相连的设备描述表wglMakeCurrent() 得到当前的设备描述表


HGLRC wglCreateContext(Hdc hdc)功能:建立一个新的图形操作描述表。这个图形操作描述表和设备描述表所指定的设备是一致的。参数说明:hdc:指定一个设备描述表。如果这个函数调用成功,则返回图形操作。描述表;否则,返回NULL。

BOOL wglDeleteContext(HGLRC hglrc)功能:删除一个图形操作描述表。参数说明:hglrc:指定一个图形操作描述表。
如果这个函数调用成功,返回TRUE;否则,返回FALSE。

HGLRC wglGetCurrentContext(void)功能:获得当前的图形操作描述表。如果这个函数调用成功,返回当前的图形操作描述表;否则,返回NULL。

HDC wglGetCurrentDC(void)功能:获得和当前图形操作描述表相联系的设备描述表。如果这个函数调用成功,返回和当前的图形操作描述表相联系的设备描述表;否则,返回NULL。

BOOL wglMakeCurrent(HDC hdc,HGLRC hglrc)功能:使所指定的图形操作描述表是当前的。这个函数调用以后,所有的OpenGL绘制操作是在被hdc指定的设备上进行的。参数说明:hdc:指定一个设备描述表。hglrc:指定一个图形操作描述表。如果这个函数调用成功,返回TRUE;否则,返回FALSE。

图形操作描述表相关函数在实例中的应用:HDC hdc;HGLRC hglrc;
hglrc=wglCreateContext(hdc);
wglMakeCurrent(hdc,hglrc);
Drawscence();
wglMakeCurrent(NULL,NULL);
wglDeleteContext(hglrc);
 
 

 

管理像素格式的函数

函数功能:ChoosePixelFormat() 返回与制定像素格式最相近的像素格式
DescribePixelFormat() 得到指定制定像素格式的信息
GetPixelFormat() 得到指定像素格式
SetPixelFormat() 设置像素格式

管理像素格式的函数之一
int ChoosePixelFormat(HDC hdc,CONST PIXELFORMATDESCRIPTOR *,pfd)功能:使一个设备描述表支持的合适像素格式与一个给定的像素格式定义相匹配。
参数说明:
hdc:指定一个设备描述表。
pfd:指定具体的像素格式。
如果这个函数调用成功,像素格式的索引值被返回;否则,返回零。

管理像素格式的函数之二
int DescribePixelFormat(HDC hdc,int pixelformat,UINT nBytes,LPPIXELFORMATDESCRIPTOR pfd)功能:这个函数获得被pixelformat指定的像素格式的信息,pixelformat是和设备描述表hdc联系的。
参数说明: 
hdc:指定一个设备描述表。
pixelformat:指定像素格式的索引,该值只能是大于1的整数。
nBytes:结构pfd所使用内存空间的大小。
pfd:是一个PIXELFORMATDESCRIPTOR结构,在这个结构体中存放表示像素格式的相关数据。
如果这个函数调用成功,返回值是设备描述表的像素格式的最大索引;否则,返回零。

管理像素格式的函数之三

int GetPixelFomat(HDC hdc)功能:这个函数获得指定的被选择的当前像素格式的索引。
参数说明:
hdc:指定一个设备描述表。
如果这个函数调用成功,返回值是当前像素格式的索
引;否则,返回零。

管理像素格式的函数之四
BOOL SetPixelFormat(HDC hdc,int pixelformat,CONST PIXELFORMATDESCRIPTOR * pfd)功能:这个函数设置当前像素格式。参数说明:
hfd:指定设备描述表。
pixelformat:指定被设置像素格式的索引。
pfd:一个指针,指向一个PIXELFORMATDESCRIPTOR结构。
如果这个函数调用成功,返回TRUE,否则,返回 FALSE。

在对话框中绘制OpenGL图形,其主要步骤与关键技术是:
       在对话框中建立OpenGL绘图的窗口,并按OpenGL的要求设置好窗口的属性和风格。在该窗口的创建过程中,设置好显示的像素格式,并创建OpenGL绘制描述表。在窗口的创建过程中,首先获得Windows设备描述表,然后将其与事先设置好的OpenGL绘制描述表联系起来。调用OpenGL命令进行图形绘制。退出OpenGL图形窗口时,释放OpenGL绘制描述表RC和Windows设备描述表DC。

在单文档中绘制OpenGL图形,其主要步骤与关键技术是:

        在单文档窗口的创建过程中,设置好显示的像素格式,并按OpenGL的要求设置好窗口的属性和风格。首先获得Windows设备描述表,然后将其与事先设置好的OpenGL绘制描述表联系起来。调用OpenGL命令进行图形绘制。退出OpenGL图形窗口时,释放OpenGL绘制描述表RC和Windows设备描述表DC。

在多文档中绘制OpenGL图形,相对比较复杂,其主要步骤与关键技术是:
        由于在多文档中有多个窗口需要绘制,而当前的OpenGL绘制描述表只能有一个,因此,在窗口的图形绘制完之
后,必须将OpenGL绘制描述表释放,以备其他窗口所用。必须新建一个视图类,在该视图类中对Windows设备描述表和OpenGL的绘制描述表进行管理,而应用程序中的其他各视图均从该类中派生。在该新建的视图类定义一个OpenGL绘图的虚函数,在其派生的类中可以对其进行重载,也就可以在应用程序中的视图类直接调用OpenGL命令绘图。必须取消派生的视图类的WM_DRAW消息处理函数和PreCreateWindow函数。

要求:
在Visual C++ 6.0环境下,用OpenGL在屏幕上
画点。(基于单文档)

         建立新项目。在VC中,选择File|New,在弹出的对话中选择Projects面板,再在列表框中选择MFCAppWizard(exe),建立一个MFC单文档视图结构的应用程序。添加头文件。在项目的视图头文件中添加如下代码#include <gl/gl.h> #include <gl/glu.h>添加静态库。选择Project|Settings 命令,在Link面板的Object/Library Modules 文本框输入opengl32.lib和glu32.lib,中间用空格隔开。

选择View|Class Wizard 命令,在Message Map 面板中为视图类添加以下消息函数
OnDestroy(); //对应WM_DESTROY消息
OnSize(); //对应WM_SIZE 消息
OnCreate(); //对应WM_CREATE消息

在视图类中添加的三个新函数为
void CExam1View::Draw();
void CExam1View::gl_Init();
void CExam1View::gl_Point(GLint x,GLint y)

添加保护型变量
HDC m_hDC; //设备描述表
HGLRC m_hRC; //图形操作描述表
在CExam1View的成员函数OnDraw()中加入对Draw()
的调用。编译并执行程序

void CExam1View::OnDestroy()
{
CView::OnDestroy();
::wglMakeCurrent(NULL,NULL); //设置当前图形操作描述表为空
::wglDeleteContext(m_hRC); //删除图形操作描述表
}

 

int CExam1View::OnCreate(LPCREATESTRUCT lpCreateStruct) 字串4
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
gl_Init(); //初始化OpenGL绘图环

return 0;
}

void CExam1View::OnSize(UINT nType, int cx, int cy)

{
CView::OnSize(nType, cx, cy);
glViewport(0,0,cx,cy);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-cx/2,cx/2,-cy/2,cy/2,-10,10);
}

void CExam1View::Draw()
{
glClearColor(1.0f,1.0f,1.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT); //置窗口底色为白色
glColor3f(0.0f,0.0f,0.0f); //设置绘图颜色为黑色
for(int i=0;i<=200;i++) gl_Point(i,0);
glFlush(); //显示上述OpenGL命令的执行效果

}

void CExam1View::gl_Init()

{ //下面的结构说明绘图设备的像素格式

PIXELFORMATDESCRIPTOR pfd={

sizeof(PIXELFORMATDESCRIPTOR), //数据结构大小

1,
数据结构版本号

PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,

PFD_TYPE_RGBA,//缓冲区可以在窗口上绘图,支持OpenGL绘图

24, //深度颜色缓冲区位数

0,0,0,0,0,0, //忽略颜色位

0,0,0, //没有非透明度缓存,忽略移位位,无累加缓存

0,0,0,0, //忽略累加位

32, //32位深度缓存

0, //无模板缓存

0, //无辅助缓存

PFD_MAIN_PLANE, // 主层

0, //保留

0,0,0, //忽略层,可见性和损毁掩膜

};

OpenGL 使用介绍第34页
OpenGL 使用介绍第35页
OpenGL编程举例
m_hDC=GetDC()->GetSafeHdc();
int nPixelFormat=::ChoosePixelFormat(m_hDC,&pfd);
::SetPixelFormat(m_hDC,nPixelFormat,&pfd);

m_hRC=::wglCreateContext(m_hDC);
/*指定OpenGL的图形操作设备表是m_hRC,并且建立它与当前绘图设备
m_hDC间的连接,下列函数执行后,所有绘图命令的结果都出现在设
备m_hDC上*/
::wglMakeCurrent(m_hDC,m_hRC);
}

OpenGL 使用介绍第36页
OpenGL编程举例
void CExam1View::gl_Point(GLint x, GLint y)
{
glBegin(GL_POINTS); //画一个点
glVertex2d(x,y); //默认颜色为黑色
glEnd();
}

原创粉丝点击