OpenGL自学文档.docx

上传人:b****3 文档编号:5487785 上传时间:2022-12-17 格式:DOCX 页数:25 大小:306.48KB
下载 相关 举报
OpenGL自学文档.docx_第1页
第1页 / 共25页
OpenGL自学文档.docx_第2页
第2页 / 共25页
OpenGL自学文档.docx_第3页
第3页 / 共25页
OpenGL自学文档.docx_第4页
第4页 / 共25页
OpenGL自学文档.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

OpenGL自学文档.docx

《OpenGL自学文档.docx》由会员分享,可在线阅读,更多相关《OpenGL自学文档.docx(25页珍藏版)》请在冰豆网上搜索。

OpenGL自学文档.docx

OpenGL自学文档

12.6多媒体知识讲座(内容见讲座文稿)

12.7OpenGL编程基础

12.7.1计算机图形处理软件

通用编程软件包:

常常是图形库,提供了生成各种图形、实现图形的处理和输入输出操作、控制和处理各种图形设备以及交互过程中的各种事件,如OpenGL。

专用编程软件包:

一般由程序员在开发时使用。

专用应用图形软件包是具有图形处理能力的交互式图形软件系统,为非程序员提供的而且往往应用于某个或某些领域,如AutoCAD、3DSMAX等。

专用应用图形软件包使用范围广,使用人员众多。

12.7.2Windows图形环境介绍与图形软件开发(略)

12.7.3OpenGL介绍

1、OpenGL基本概念

OpenGL(OpenGraphicsLibrary,即开放性图形库)是以SGI的GL三维图形库为基础制定的一个开放式三维图形标准。

SGI在1992年7月发布了1.0版。

OpenGL规范由ARB(OpenGLArchitectureReviewBoard,OpenGL结构评审委员会)负责管理,目前加入OpenGLARB的成员有SGI、Microsoft、Intel、IBM、SUN、Compaq、HP等公司,它们均采用了OpenGL图形标准,许多软件厂商以OpenGL为基础开发自己的产品,硬件厂商提供对OpenGL的支持。

由于OpenGL的广泛应用,它已经成为一个工业标准。

2、OpenGL的设备独立性

OpenGL独立于硬件设备、窗口系统和操作系统,使得以OpenGL为基础开发的应用程序可以在各种平台间移植。

OpenGL可以运行在当前各种流行操作系统之上,如Windows95/98、WindowsNT/2000、Linux、MacOS、Unix、OS/2等。

特别需要指出的是,由于Microsoft公司在其Windows95或更高版本的操作系统和Visual系列高级语言开发环境中捆绑了OpenGL标准,使得OpenGL在微机中得到了更为普遍的应用。

3、OpenGL的编程语言

OpenGL可以与各种编程语言紧密接口。

各种流行的编程语言如C、C++、Fortran、Ada、Java等都可以调用OpenGL中的库函数。

4、OpenGL的主要功能

(1)绘制与建型:

提供了绘制点、线、多边形、球、锥、多面体、茶壶等复杂的三维物体以及贝塞尔、NURBS等复杂曲线或曲面的绘制函数。

(2)各种变换:

提供了平移、旋转、变比和镜像四种基本变换以及平行投影和透视投影两种投影变换。

通过变换实现三维的物体在二维的显示设备上显示。

(3)着色模式:

提供了RGBA模式和颜色索引两种颜色的显示方式。

(4)光照处理:

在自然界我们所见到的物体都是由其材质和光照相互作用的结果,OpenGL提供了辐射光(EmittedLight)、环境光(AmbientLight)、漫反射光(DiffuseLight)和镜面光(SpecularLight)。

材质是指物体表面对光的反射特性,在OpenGL中用光的反射率来表示材质。

(5)纹理映射(TextureMapping):

将真实感的纹理粘贴在物体表面,使物体逼真生动。

纹理是数据的简单矩阵排列,数据有颜色数据、亮度数据和alpha数据。

位图和图像:

提供了一系列函数来实现位图和图像的操作。

位图和图像数据均采用像素的矩阵形式表示。

(6)制作动画:

提供了双缓存(DoubleBuffering)技术来实现动画绘制。

双缓存即前台缓存和后台缓存,后台缓存用来计算场景、生成画面,前台缓存用来显示后台缓存已经画好的画面。

当画完一帧时,交互两个缓存,这样循环交替以产生平滑动画。

(7)选择和反馈:

OpenGL为支持交互式应用程序设计了选择操作模式和反馈模式。

在选择模式下,则可以确定用户鼠标指定或拾取的是哪一个物体,可以决定将把哪些图元绘入窗口的某个区域。

而反馈模式,OpenGL把即将光栅化的图元信息反馈给应用程序,而不是用于绘图。

(8)其它。

此外,OpenGL还提供了反走样技术,能够实现深度暗示(DepthCue)、运动模糊(MotionBlur)、雾化(Fog)等特殊效果。

12.7.4OpenGL介绍的绘制流程和原理

OpenGL指令从左侧进入OpenGL,有两类数据,分别是由顶点描述的几何模型和由像素描述的位图、影像等模型,其中后者经过像素操作后直接进入光栅化。

评价器(Evaluator)用于处理输入的模型数据,例如对顶点进行转换、光照,并把图元剪切到视景体中,为下一步光栅化做好准备。

显示列表(DisplayList)用于存储一部分指令,留待合适时间以便于快速处理。

光栅化将图元转化成二维操作,并计算结果图像中每个点的颜色和深度等信息,产生一系列图像的帧缓存描述值,其生成结果称为基片(Fragment)。

基片操作主要的有帧缓存的更新、测试、融合和屏蔽操作,以及基片之间的逻辑操作和抖动(Dithering)。

12.7.5OpenGL的函数库

1、函数分类

(1)基本函数

库函数以“gl”为前缀,是OpenGL之核心,共有115个函数,所有OPENGL功能均可通过它们实现。

(2)实用函数

库函数以“glu”为前缀,提供了43个涵数,减少了程序员的负担。

(3)辅助函数

库函数以“aux”为前缀,由C编写而成,共有31个函数,主要用来提供窗口的功能。

2、OpenGL静态库

Opengl32.lib

glu32..lib

Glaux.lib

分别与上面的函数库对应

3、OpenGL辅助库功能介绍

(1)窗口管理

1)auxInitWindow()

主要用来在屏幕上开一窗口,标题由参数出。

默认背景为黑色。

2)auxInitPosition()

通知auxInitWindow()应把窗口放在屏幕的位置

3)auxInitDisplayMode()

指定各种显示模式。

如RGBA模式或颜色索引模式、双缓存还是单缓存等

(2)处理输入事件

1)auxReshapeFunc()

当窗口大小或位置改变时要执行的动作

2)auxKeyFunc()auxMouseFunc()

处理键盘或MOUSE的事件

(3)绘制三维形体

球体(Sphere)十二面体(Dodecahedron)

八面体(Octahedron)二十面体(Icosahedron)

圆锥体(Cone)圆环(Torus)

立方体(Cube)茶壶(Teapot)

12.7.6OpenGL的基本语法

1、OpenGL的语法可概括为:

(1)基本库的所有函数都以“gl”为前缀

(2)实用库的所有函数都以“glu”为前缀

(3)辅助库的所有函数都以“aux”为前缀

(4)常数通常以GL_开头,如GL_TRUE

(5)OPENGL常带有后缀,如:

glcolor3f();其中“3”表示颜色由三个分量组成,而“f”则表示每个分量是浮点型的。

(6)OPENGL有些命令最后带有一个“V”,它表示其中的参数是矢量。

2、后缀与数据类型

b8位整数GLbyte

s16位整数GLshort

i32位整数GLint

f32浮点数GLfloat

d64浮点数GLdouble

ui32位无符号整数GLuint

12.7.7VC++开发OpenGL绘图程序(Win32控制台程序)

1.新建一个Win32ConsoleApplication

2、在项目的setting…中,选中link标签,在object/librarymodules中输入上面的三个库:

opengl32.libglu32.libglaux.lib

3、这时一个控制台型的OpenGL应用程序就建立完毕了。

例:

ep1_1。

Dsw

//ep1_1.cpp:

Definestheentrypointfortheconsoleapplication.//

//ep1_1.cpp:

Definestheentrypointfortheconsoleapplication.

//

#include"stdafx.h"

#include

#include

#include

#include

intmain(intargc,char*argv[])

{

//OpenAWindowPlease();

auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);

auxInitPosition(0,0,796,600);

auxInitWindow("编程指南例程1-2");

glClearColor(0.0,0.0,0.0,0.0);//指定清空颜色

glClear(GL_COLOR_BUFFER_BIT);

glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);

glColor3f(0.0,0.0,1.0);//指定绘制物体颜色

//正交投影模式

glBegin(GL_POLYGON);

glVertex2f(-0.5,-0.5);//此处可以用glColor3f设置

glVertex2f(-0.5,0.5);//每个顶点的颜色生成一个

glVertex2f(0.5,0.5);//五颜六色的多边形。

glVertex2f(0.5,-0.5);

glEnd();

glFlush();

Sleep(400);

return0;

}

12.7.8VC++开发OpenGL绘图程序(MFC应用程序)

1、像素格式

typedefstructtagPIXELFORMATDESCRIPTOR{//pfd

WORDnSize;//该结构的大小sizeof(PIXELFORMATDESCRIPTOR)

WORDnVersion;//版本目前为1。

0

DWORDdwFlags;//像素格式的属性技巧P86(另:

帮助中有更多属性能如:

//PFD_GENERIC_ACCELERATED)

BYTEiPixelType;//点的颜色表示模式:

PFD_TYPE_RGBA或者说PFD_TYPE_INDEX

BYTEcColorBits;//一个点的颜色用多少位表示(颜色缓存中颜色位平面的个数,thenumberofcolorbitplanes

//ineachcolorbuffer)

BYTEcRedBits;//一个点的红颜色用多少位表示(颜色缓存中,红颜色位平面的个数,thenumberofred

//bitplanesineachRGBAcolorbuffer)

BYTEcRedShift;//红色位平面可调节(移位?

)的位数

BYTEcGreenBits;//类同上

BYTEcGreenShift;//类同上

BYTEcBlueBits;//类同上

BYTEcBlueShift;//类同上

BYTEcAlphaBits;//类同上

BYTEcAlphaShift;//类同上

BYTEcAccumBits;//累积缓存中,一个点用多少位表示(thetotalnumberofbitplanesintheaccumulation

//buffer)

BYTEcAccumRedBits;//类同上

BYTEcAccumGreenBits;//类同上

BYTEcAccumBlueBits;//类同上

BYTEcAccumAlphaBits;//类同上

BYTEcDepthBits;//深度(Z-轴)缓存的深度(位bit)(thedepthofthedepth(z-axis)buffer)如:

32位等

BYTEcStencilBits;//模板缓存的深度(位bit)thedepthofthestencilbuffer

BYTEcAuxBuffers;//辅助缓存的个数(thenumberofauxiliarybuffers),当前不被支持

BYTEiLayerType;//以前的OPENGL版本使用,但现不被使用了

BYTEbReserved;//覆盖和衬垫的位数。

0-3可指定最多15个覆盖位面,4-7指定最多15个衬垫位面。

(the

//numberofoverlayandunderlayplanes.Bits0through3specifyupto15overlayplanes

//andbits4through7specifyupto15underlayplanes).

DWORDdwLayerMask;//现在不被使用

DWORDdwVisibleMask;//thetransparentcolororindexofanunderlayplane.WhenthepixeltypeisRGBA,

//dwVisibleMaskisatransparentRGBcolorvalue.Whenthepixeltypeiscolorindex,itis

//atransparentindexvalue.

DWORDdwDamageMask;//现不被支持

}PIXELFORMATDESCRIPTOR;

2、MFC中使用OpenGL的步骤

(1)对像素格式结构赋值

staticPIXELFORMATDESCRIPTORpfd=

{

sizeof(PIXELFORMATDESCRIPTOR),//sizeofthispfd

1,//versionnumber

PFD_DRAW_TO_WINDOW|//supportwindow

PFD_SUPPORT_OPENGL|//supportOpenGL

PFD_DOUBLEBUFFER,//doublebuffered

PFD_TYPE_RGBA,//RGBAtype

24,//24-bitcolordepth

0,0,0,0,0,0,//colorbitsignored

0,//noalphabuffer

0,//shiftbitignored

0,//noaccumulationbuffer

0,0,0,0,//accumbitsignored

32,//32-bitz-buffer

0,//nostencilbuffer

0,//noauxiliarybuffer

PFD_MAIN_PLANE,//mainlayer

0,//reserved

0,0,0//layermasksignored

};

(2)匹配设备像素格式和给定的像素格式,并返最靠近的像素格式描述符的索引值

原型:

intChoosePixelFormat(

HDChdc,//devicecontexttosearchforabestpixelformat

//match

CONSTPIXELFORMATDESCRIPTOR*ppfd

//pixelformatforwhichabestmatchissought

);

调用:

intpixelformat;

if((pixelformat=ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd))==0)

{

MessageBox("ChoosePixelFormatfailed");

returnFALSE;

}

(3)按指定的像素格式设置设备像素格式

原型:

BOOLSetPixelFormat(

HDChdc,//devicecontextwhosepixelformatthefunction

//attemptstoset

intiPixelFormat,

//pixelformatindex(one-based)

CONSTPIXELFORMATDESCRIPTOR*ppfd

//pointertologicalpixelformatspecification

);

调用:

if(SetPixelFormat(m_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)

{

MessageBox("SetPixelFormatfailed");

returnFALSE;

}

(4)若还要创建调色板,还需要像素格式的下列两个函数

1)返回指定设备描述表的当前选定像素格式的索引

intGetPixelFormat(

HDChdc//devicecontextwhosecurrentlyselectedpixelformat

//indexissought

);

2)返回指定设备描表和指定像素格式索引的像素格式详细信息。

intDescribePixelFormat(

HDChdc,//devicecontextofinterest

intiPixelFormat,//pixelformatselector

UINTnBytes,//sizeofbufferpointedtobyppfd

LPPIXELFORMATDESCRIPTORppfd

//pointertostructuretoreceivepixel

//formatdata

);

(5)创建一个新的OpenGL图形操作(渲染)描述表

原型:

HGLRCwglCreateContext(

HDChdc//devicecontextofdevicethattherenderingcontext

//willbesuitablefor

);

调用:

hrc=wglCreateContext(m_pDC->GetSafeHdc());

其中:

hrc的类型为HGLRC

(6)把指定的OpenGL图形操作(渲染)描述表设置为当前线程(hdc)的图形操作描述表,随后的OpenGL操作均在其内进行。

原型:

BOOLwglMakeCurrent(

HDChdc,//devicecontextofdevicethatOpenGLcallsare

//tobedrawnon

HGLRChglrc//OpenGLrenderingcontexttobemadethecalling

//thread'scurrentrenderingcontext

);

调用:

wglMakeCurrent(m_pDC->GetSafeHdc(),hrc);

(7)删除OpenGL图形操作(渲染)描述表(一般在OnDestroy中进行)

//adddown

HGLRChrc;

//撤消时间步

KillTimer

(1);

hrc=:

:

wglGetCurrentContext();

:

:

wglMakeCurrent(NULL,NULL);

if(hrc)

:

:

wglDeleteContext(hrc);

if(m_pDC)

deletem_pDC;//释放已创建的设备描述表CDC

注:

未尽之处,请参阅OpenGL编程实例与技巧第五章Cube示例

见CUBE。

DSW

12.7.9图形变换

1、矢量

●矢量具有确定的方向和大小(长度)

●矢量是流动的,无位置概念

●矢量的运算C=A+B,B=2A

2、坐标系

右手坐标系

3、图形的几何变换

(1)分类

平移

旋转

缩放

(2)目的

改变图形的:

位置

方向

大小

3)平移(Translation)

沿某一方向移动一段距离

(4)缩放(scaling)

在x、y、z方向上进行拉伸

(5)旋转(rotation)

沿某一方向转动一定角度

4、透视投影

●视景体(圆台、四棱台)

4、透视投影

●上方矢量

前后裁剪面

5、透视投影变换

6、平行投影

●平行投影的显示模型

7、平行投影变换

8、视口变换

11、OpenGL的坐标变换机制

(1)有关的数据结构

●两个坐标变换矩阵(4X4)

–ModelView矩阵GL_MODELVIEW

–Projection矩阵GL_PROJECTION

–glMatrixMode(GL_MODELVIEW);

–glMatrixMode(GL_PROJECTION);

●两个用于存储矩阵的堆栈:

–ModelView矩阵堆栈

–Projection矩阵堆栈

(2)ModelView变换机制

●Model变换的目的是改变物体的位置和尺寸

●View变换的目的是改变观察的方向

●以上两个目的是用一个手段来实现的,即:

操作ModelView矩阵

(3)Model变换的使用方法

●首先使以下函数,表示开始操作ModelView矩阵

–glMatrixMode(GL_MODELVIEW);

●操作ModelView矩阵进行Model变换的方法分两类:

●glLoadIdentity();

●glLoadMatrixf(*m);//手工

●glMultMatrixf(*m);

●glTranslatef(dx,dy,dz);

●glRotatef(angle,vx,vy,vz);//自动

●glScalef(sx,sy,sz);

(4)View变换的使用方法

●可以使用上述所有函数来设值观察方向

●利用以下函数则更方便:

–gluLookAt(ex,ey,ez,ax,ay,az,px,py,pz);

–e—视点

–a—被观察点

–p—向上方向

含义:

选准一个位置(视野较好,

(eyex,eyey,eyez)),选准前面一个点(中心点

centerx,centery,centerz),先水平地看这个点,然后偏头到一定的角度(upx,upy,upz).

(6)平行投影的使用方法

●投影矩阵

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1