opengl编程基本流程--康建超

Download Report

Transcript opengl编程基本流程--康建超

OpenGL编程基本流程
康健超
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.
OpenGL介绍
• OpenGL是图形硬件的一个软件接口。它的
主要作用是将二维或三维的对象绘入一个
帧缓冲区中。对象被描述为一系列的顶点
(用来定义几何对象)或像素(用来定义
图像)。OpenGL 对数据进行几个步骤的
处理从而将其转换成像素,这些像素将在
帧缓冲区中形成最终需要的图形。
Slide No. 2
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.
OpenGL介绍
• OpenGL是一种C/S架构,没有提供用于描
述三维物体模型的高层函数,仅仅提供少
数几个基本图元函数。
• OpenGL的移植性好、使用简单、效率高。
• OpenGL的功能如下:建模、变换、颜色模
式设置、纹理映射、位图显示和图像增强、
双缓冲。
Slide No. 3
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.
OpenGL介绍
• OpenGL包括大约250个函数(其中200个在OpenGL
核心中,其他50个在OpenGL使用库中),可以使
用它们来指定物体和操作,以创建交互式三维应
用程序。
• OpenGL包括实用库(GLU)、实用工具包(GLUT)
• OpenGL函数中包含前缀gl,且每个单词的首字母
都是大写,如glColor3f()。同样,OpenGL常量
都以GL打头,且所有字母都是大写,单词之间用
下划线相连,如GL_COLOR_BUFFER_BIT。
• 有些OpenGL函数的名称中包含后缀“v”,这表
明它将一个指向向量(数组)的指针(而不是一
系列的值)作为参数。
Slide No. 4
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.
OpenGL环境配置
• 将glut32.lib、glut.lib放在VC6.0安装目录下
VC98\Lib文件夹下。
• gltu.h放在VC6.0安装目录下VC98\Include\GL文
件夹下。
• Glut32.dll、glut.dll放在
C:\WINDOWS\system32文件夹下。
• 在Project Setting->Link标签下的library
modules下输入和OpenGL相关的库OpenGL32.lib
glu32.lib glaux.lib glut32.lib。
Slide No. 5
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.
建立OpenGL程序
• 包含文件
#include <GL/gl.h>,#include<GL/glu.h>
• 像素格式
通过一种叫做PIXELFORMATDESCRIPTOR的结构,
来完成对像素属性的设置,包括缓存设置、颜色
模式、颜色位数、深度缓存位数等。
• 渲染描述表
用来保存着在窗口中用来渲染一个场景所需的信
息。一个OpenGL应用程序必须有一个渲染描述表,
并且在进行OpenGL绘制之前它应当是当前的。
Slide No. 6
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.
指定几何体的OpenGL模型
• 指定几何体函数:
glBegin(mode)
//顶点列表:在mode所指定的绘图模式下创建模型的顶点数据。
//外观属性信息:比如颜色,法线和纹理信息坐标也可以指定
glEnd();
• mode :说明顶点列表创建图像的方式
比如:
GL_POINTS :为顶点列表中的顶点创建一个点
GL_LINES:顶点列表中的每两个顶点,创建一条线
GL_LINES_STRIP:顶点列表中的所有顶点依次连成一条线
GL_TRIANLE:顶点列表中的三个顶点数据为一组,连成一个三角形
GL_QUADS:顶点列表中的四个顶点数据为一组,连成一个四边形
Slide No. 7
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.
指定几何体的OpenGL模型
• 顶点列表中如何指定顶点
• glVertex*()代表的是一系列仅顶点数据类型
不同的函数:
glVertex3f(x,y,z):顶点坐标为是GLfloat
glVertex2d(x,y):顶点是2维的Glint
glVertex3fv(x): x为向量 Glfloat x[3]
Slide No. 8
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.
OpenGL工具中的附加对象
• 1 GLU二次曲面对象
• 声明二次曲面对象:GLUquadric *gluNewQuadric(void)
圆柱体: void gluCylinder(……),球体: void gluSphere(……)
圆盘:void gluDisk(……)
• 2 GLUT 对象
• GLUT 提供的模型是几何实体,形状固定。
圆锥 : glutSolidCone/glutWireCone
立方体:glutSolidCube
十二面体:glutSolidDodecahedron
八面体:glutSolidOctahedron
球体:glutSolidSphere
茶壶:glutSolidTeapot
四面体:glutSolidTetrahedron
圆环:glutSolidTorus
Slide No. 9
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.
OpenGL中的变换
1.投影变换
由用户定义的投影生成
void gluPerspective( GLdouble fovy//角度, GLdouble aspect //
视景体的宽高比, GLdouble zNear//沿z轴方向的两裁面之
间的距离的近处, GLdouble zFar//沿z轴方向的两裁面之间
的距离的远处, ); //设置透视投影矩阵
void glOrtho( GLdouble left, GLdouble right, GLdouble bottom,
GLdouble top, GLdouble zNear, GLdouble zFar );//将当前的
可视空间设为正投影空间
Slide No. 10
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.
OpenGL中的变换
• 2 模视变换
• 从用户的视图变换以及所有在程序当中用到的模
型变换得到。
• void gluLookAt( GLdouble eyex, GLdouble eyey,
GLdouble eyez, GLdouble centerx, GLdouble
centery, GLdouble centerz, GLdouble upx, GLdouble
upy, GLdouble upz );//定义视点矩阵
• 实际的编程应用中,用户在完成场景的建模后,
往往需要选择一个合适的视角或不停地变换视角
Slide No. 11
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.
OpenGL中的变换
• 模型变换:
旋转:glRotatef(angle,x,y,z)
平移:glTranslate(tx,ty,tz)
缩放:glScalef(sx,sy,sz)
如何使用:
glMatrixMode(GL_MODEVIEW);//设置当前
的矩阵为模视矩阵。
glLoadIdentity();//设置为默认的单位矩阵
Slide No. 12
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.
控制台下的OpenGL程序
• 控制台下OpenGL程序的组成部分:
void main()
void SetupRC(void)// 设置初始渲染状态
void RenderScene(void)//绘制场景及绘图
void ChangeSize(GLsizei w,GLsizei h)//修改可
视区域和视口,当窗口改变大小时被调用
Slide No. 13
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.
MFC下的OpenGL程序
• MFC下的OpenGL程序和控制台下的
OpenGL程序的对应关系:
• BOOL View::InitializeOpenGL(CDC* pDC)
void SetupRC(void)// 设置渲染状态
• void View::OnSize(UINT nType, int cx, int cy)
void ChangeSize(GLsizei w,GLsizei h)//修改可使区
域
• BOOL View::RenderScene()
void RenderScene(void)//绘制场景
Slide No. 14
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.
程序
• 一个简单的OpenGL程序,绘制一个立方体
和一个球体。
Slide No. 15
http://www.judyfengjunlab.cn/ 信息技术学院613实验室 . All rights reserved 2009.