第三讲 一个简单的例子

先编译运行一个简单的例子,这样我们可以有一个直观的印象。从这个例子我们可以看到OpenGL可以做什么,当然这个例子只做了很简单的一件事--绘制一个彩色的三角形。除此以外,我们还可以看到典型的OpenGL程序结构及openGL的运行顺序。

  例1:本例在黑色的背景下绘制一个彩色的三角形,如图一所示。

#include <stdlib.h>
#include <GL/glut.h>
void background(void)
{
 glClearColor(0.0,0.0,0.0,0.0);//设置背景颜色为黑色
}

void myDisplay(void)
{
 glClear(GL_COLOR_BUFFER_BIT);//buffer设置为颜色可写

 glBegin(GL_TRIANGLES);//开始画三角形
 glShadeModel(GL_SMOOTH);//设置为光滑明暗模式

 glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色
 glVertex2f(-1.0,-1.0);//设置第一个顶点的坐标为(-1.0,-1.0)

 glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色
 glVertex2f(0.0,-1.0);//设置第二个顶点的坐标为(0.0,-1.0)

 glColor3f(0.0,0.0,1.0);//设置第三个顶点为蓝色
 glVertex2f(-0.5,1.0);//设置第三个顶点的坐标为(-0.5,1.0)
 glEnd();//三角形结束

 glFlush();//强制OpenGL函数在有限时间内运行
}

void myReshape(GLsizei w,GLsizei h)
{
 glViewport(0,0,w,h);//设置视口

 glMatrixMode(GL_PROJECTION);//指明当前矩阵为GL_PROJECTION
 glLoadIdentity();//将当前矩阵置换为单位阵

 if(w <= h)
  gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);//定义二维正视投影矩阵
 else
  gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);
  glMatrixMode(GL_MODELVIEW);//指明当前矩阵为GL_MODELVIEW
}

int main(int argc,char ** argv)
{
 /*初始化*/
 glutInit(&argc,argv);
 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
 glutInitWindowSize(400,400);
 glutInitWindowPosition(200,200);

 /*创建窗口*/
 glutCreateWindow("Triangle");

 /*绘制与显示*/
 background();
 glutReshapeFunc(myReshape);
 glutDisplayFunc(myDisplay);

 glutMainLoop();
 return(0);
}


图一:一个彩色的三角形


  首先创建工程,其步骤如下:

  1)创建一个Win32 Console Application。

  2)链接OpenGL libraries。在Visual C++中先单击Project,再单击Settings,再找到Link单击,最后在Object/library modules 的最前面加上OpenGL32.lib GLu32.lib GLaux.lib

  3)单击Project Settings中的C/C++标签,将Preprocessor definitions 中的_CONSOLE改为__WINDOWS。最后单击OK。

  现在你可以把下面的例子拷贝到工程中去,编译运行。你可以看到一个彩色的三角形。

  我们先看看main函数。函数中以glut开头的函数都包含在glut.h中。GLUT库的函数主要执行如处理多窗口绘制、处理回调驱动事件、生成层叠式弹出菜单、绘制位图字体和笔画字体,以及各种窗口管理等任务。

  ·glutInit用来初始化GLUT库并同窗口系统对话协商。

  ·glutInitDisplayMode用来确定所创建窗口的显示模式。本例中的参数GLUT_SINGLE 指定单缓存窗口,这也是缺省模式,对应的模式为GLUT_DOUBLE 双缓存窗口。参数GLUT_RGB指定颜色RGBA模式,这也是缺省模式,对应的模式为GLUT_INDEX 颜色索引模式窗口。

  ·glutInitWindowSize 初始化窗口的大小,第一个参数为窗口的宽度,第二个参数为窗口的高度,以像素为单位。

  ·glutInitWindowPosition 设置初始窗口的位置,第一个参数为窗口左上角x的坐标,第二个参数为窗口左上角y的坐标,以像素为单位。屏幕的左上角的坐标为(0,0),横坐标向右逐渐增加,纵坐标向下逐渐增加。

  ·glutCreateWindow 创建顶层窗口,窗口的名字为扩号中的参数。

  ·background() 这是自己写的函数,设置背景。其实这个函数中的语句可以写在display函数中,但为了使功能块更加清晰,所以把背景这一部分单独提出来。

  ·glutReshapeFunc 注册当前窗口的形状变化回调函数。当改变窗口大小时,该窗口的形状改变回调函数将被调用。在此例中就是myReshape指定形状变化函数。

  ·glutDisplayFunc 注册当前窗口的显示回调函数。当一个窗口的图像层需要重新绘制时,GLUT将调用该窗口的的显示回调函数。在此例中的mydisplay就是显示回调函数,显示回调函数不带任何参数,它负责整个图像层的绘制。我们的大部分工作将集中在这个函数中。

  ·glutMainLoop 进入GLUT事件处理循环。glutMainLoop函数在GLUT程序中最多只能调用一次,它一旦被调用就不再返回,并且调用注册过的回调函数。所以这个函数必须放在注册回调函数的后面,此例中为glutReshapeFunc, glutDisplayFunc。 

现在我们对OpenGL程序的典型的程序结构有了一个了解。首先初始化,包括对GLUT库的初始化和对窗口的设置及显示模式的设置。第二,创建窗口。第三,自己创作的核心部分。第四,glutMainLoop 进入GLUT事件处理循环。

  下面,我们转到我们的创作核心。

  background这个函数很简单,只有一行语句。glClearColor中的四个参数分别是红、绿、蓝和alpha值。这些值定义了窗口的颜色。这些值的范围在[0,1]之间。缺省值均为0。你可以改变这些值,观察背景色彩的变化。

  myDisplay画了一个彩色的三角形。

  ·glClear 将buffers设置为预先设定的值。参数GL_COLOR_BUFFER_BIT表明现在可以向buffer中写入颜色值。

  ·glBegin和glEnd是一一对应的。这两个函数限制了一组或多组图元的顶点定义。在这两个函数中间就是你所绘制的由多个顶点组成的图元。函数的参数表明了所绘制的图元的类型。本例中的GL_TRIANGLES 表明所绘制的图形为三角形。

  ·glShadeModel选择平坦或光滑渐变模式。GL_SMOOTH为缺省值,为光滑渐变模式,GL_FLAT为平坦渐变模式。

  ·glColor设置当前颜色。后面跟的数字为参数个数。3表明有三个参数,分别为红、绿、蓝,4则多一个参数alpha。紧跟数字后面的字母表示数据类型。本例中的glColor3f表示三个参数,数据类型为GLfloat。

  ·glVertex指定顶点。同样函数明中的数字表明参数个数。参数分别为x,y或x、y、z。紧跟数字后面的字母表示数据类型。本例中 glVertex2f表明两个参数,数据类型为GLfloat。窗口的中心为原心,坐标为(0,0,0)。横坐标向左为负,向右为正;纵坐标向上为正,向下为负;z坐标向屏幕里为负,屏幕外为正,坐标系符合右手定则。

  现在你将main函数中的glutReshapeFunc (myReshape); 注释掉,任意改变三角形顶点的坐标你会发现窗口的最左边,最右边的x值分别为-1和1,而窗口的最上端,最下端的y值分别为1和-1。由此可见 glVertex中坐标的值实际上是和窗口的大小成倍数的关系。好了,现在恢复原来的程序。

  ·glFlush迫使OpenGL函数在有限时间里运行。glFlush清空所有buffer,使所有发出的命令能在规定的时间内运行。一定不能忘记这一条语句。只有加了这一句,前面的命令才能执行。

  myReshape 改变窗口的大小。

  ·glViewport(Glint x,Glint y,GLsizei width,GLsizei height)设置视口。视口是一个矩形,x,y为视口左下角的坐标,以像素为单位,缺省值为(0,0)。width和height分别为视口的宽和高。 OpenGl context第一次贴到窗口上时width和height分别设置成窗口的大小。

  ·glMatrixMode 指明哪一个矩阵为当前矩阵。本例中GL_PROJECTION指明投影矩阵堆栈为随后的矩阵操作的目标。GL_MODELVIEW指明模型视景矩阵。

  ·glLoadIdentity将当前矩阵置换为单位阵。

  ·gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)定义二维正视投影矩阵。left,right分别设置左右垂直切平面的坐标,bottom,top分别设置上下垂直切平面的坐标。

  现在你可能对这几个参数的意义还不是很清楚。我们现在将myReshape 函数glLoadIdentity();后面所有的语句注释掉。加上gluOrtho2D(-1.5,1.5,-1.5,1.5);改变三角型的坐标及 gluOrtho2D中的数值,你就可以清楚的理解gluOrtho2D中数值的含义。

  现在,你应该大致了解OpenGL到底是怎么一回事。通过这一节的学习我们知道怎样使用颜色及绘制几何图形及物体的最基本的函数,更多的函数你可以在网上或有关书中查到。下一节我们继续讲一下颜色的使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书介绍了应用OpenGL开发三维图形的方法。内容包括:怎样利用Visual C 5.0 MFC中的类建立OpenGL应用程序的基本格式,建立和控制2D形状和3D形体、标准二次曲面、Bezier曲线及曲面、NURBS曲线及曲面、点光源、无限光源、聚光、基本材质、贴图材质、Mip贴图、位图字符、文字、OpenGL动画等,观察物体,操作像素、位图、图像,融合和反走样物体,雾化场景,利用帧缓存进行颜色屏蔽、深度控制、遮掩、全局场景反走样、景深模拟和场景对焦效果处理,利用对话框、菜单、鼠标选择物体、信息反馈实现OpenGL基本的交互图形程序设计。最后,本书通过6个实用例程说明如何将OpenGL的建模技术、图像处理技术和人机交互技术等3大技术进行结合。 本书涉及了所有的OpenGL核心函数和实用库函数,注重OpenGL的内存联系和实际运用。书中的每个工程文件模式固定且十分简洁,内容循序渐进。本书配有CD-ROM一张,包含了书中所有源程序和18个工程文件所生成的可执行文件等内容,帮助读者学习。本书适合于具有基本计算机图形学基础知识及Visual C 5.0 MFC编程基础知识的计算机软件开 图书目录: 第1章 走进三维真彩世界 第2章 OpenGL概述 第3章 极小化OpenGL 第4章 绘制二维图形 第5章 OpenGL变换 第6章 显示列表 第7章 模拟真实世界 第8章 OpenGL动画 第9章 OpenGL图像处理基础 第10章 纹理贴图 第11章 增强图像效果 第12章 实用库函数 第13章 曲线和曲面 第14章 高级制作技术 第15章 交互技术 第16章 制作技术与应用实例 附录 配书CD-ROM内容介绍

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值