OpenGL中常用的GLUT函数库讲解

合集下载

OpenGL代码学习(5)--2D图形上下左右移动

OpenGL代码学习(5)--2D图形上下左右移动

OpenGL代码学习(5)--2D图形上下左右移动注意:需要在配置好OpenGL的编程环境中运⾏下列代码,环境配置⽂章可参考:下⾯的代码,直接放置在main.cpp⽂件中即可:#pragma mark - 基本概念/*GLUT全名OpenGL Uitility Tools,⼀种跨平台(Windows、Mac、Linux)的GUI编程框架,⽤于辅助OpenGL显⽰GUI界⾯。

GLEW⼀种维护最好的开源OpenGL扩展加载库(⾃动初始化所有函数指针并包含所需类型定义、常量和枚举值),GLEW被预先封装在了GLTools库中。

GLToolsOpenGL快捷开发⼯具,包含⼀个⽤于操作矩阵和向量的3D数学库,⼀些产⽣和渲染简单的3D对象的函数,以及对视觉平截头体、相机类和变换矩阵进⾏管理的函数的充分⽀持。

OpenGL数据类型为了OpenGL的移植性,OpenGL定义了各种数据类型,这些数据类型可以映射到所有平台上的特定最⼩格式。

*/#pragma mark - 代码解析#include <iostream>#include "GLShaderManager.h"#include "GLTools.h"#include <glut/glut.h>GLBatch squareBatch;GLShaderManager shaderManager;/// glew// 构建四边形顶点数组,vVert包含4个顶点的(x,y,z)笛卡尔坐标GLfloat blockSize = 0.2f;//半边长GLfloat vVerts[12];// 2 为程序做⼀次性的设置void SetupRC() {/// glew// 设置背景颜⾊glClearColor(0.0f, 0.0f, 1.0f, 1.0f);/// include-GLShaderManager// 初始化着⾊管理器shaderManager.InitializeStockShaders();GLfloat blockX = -blockSize;GLfloat blockY = -blockSize;// 左下⾓vVerts[0] = blockX;vVerts[1] = blockY;vVerts[2] = 0.0f;// 右下⾓vVerts[3] = blockX + blockSize * 2;vVerts[4] = blockY;vVerts[5] = 0.0f;// 右上⾓vVerts[6] = blockX + blockSize * 2;vVerts[7] = blockY + blockSize * 2;vVerts[8] = 0.0f;// 左上⾓vVerts[9] = blockX;vVerts[10] = blockY + blockSize * 2;vVerts[11] = 0.0f;/// include-GLBatch/*GL_POINTS: 点GL_LINES: 线GL_LINE_STRIP: 条带线GL_LINE_LOOP: 循环线GL_TRIANGLES: 独⽴三⾓形GL_TRIANGLE_STRIP: 三⾓形条带GL_TRIANGLE_FAN: 三⾓形扇⾯*/// 开始构建批次,GL_TRIANGLE_FAN表⽰四边形,后⾯参数是顶点数squareBatch.Begin(GL_TRIANGLE_FAN, 4);glPointSize(9.f);glLineWidth(5.f);glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);/*批次增加存储属性CopyVertexData3f(XYZ顶点数据)CopyNormalDataf(表⾯法线)CopyColorData4f(RGBA颜⾊)CopyTexCoordData2f(纹理坐标)*/// 批次增加存储属性,顶点数据squareBatch.CopyVertexData3f(vVerts);// 结束批次属性设置,表明完成数据复制操作,不能再添加新属性squareBatch.End();}// 3 窗⼝⼤⼩改变时接受新的宽度和⾼度void ChangeSize(int w, int h) {/// glew// 设置视⼝,(x, y, w, h),其中x,y代表窗⼝中视⼝的左下⾓坐标glViewport(0, 0, w, h);}// 4 开始渲染void RenderScene(void) {/// glew// 清楚⼀个或⼀组特定的缓冲区glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);/// glew// 设置⼀组浮点数表⽰红⾊GLfloat vRed[] = {1.0f, 0.0f, 0.0f, 1.0f};/// include-GLShaderManager// 传递到存储着⾊器,即GLT_SHADER_IDENTITY着⾊器,这个着⾊器只是使⽤指定颜⾊以默认笛卡尔坐标系在屏幕上渲染⼏何图形 // 利⽤单位着⾊器设置矩形颜⾊为红⾊eStockShader(GLT_SHADER_IDENTITY, vRed);/// include-GLBatch// 根据批次⾥的顶点数据利⽤当前设置的着⾊器进⾏画图squareBatch.Draw();/// GLUT/*当glutInitDisplayMode有传⼊双缓冲模式时,将在后台缓冲区进⾏渲染,然后在结束时交换到前台为了防⽌观察者看到可能随着动画帧和动画帧之间闪烁的渲染过程*/glutSwapBuffers();}void BourceFunction(int key) {// 每次按键的矩形移动距离GLfloat stepSize = 0.025f;// 左下⾓坐标的(x,y)GLfloat blockX = vVerts[0];GLfloat blockY = vVerts[1];// 判断键盘点击的是哪个按钮,计算下⼀个点的位置if (key == GLUT_KEY_UP) {blockY += stepSize;}if (key == GLUT_KEY_DOWN) {blockY -= stepSize;}if (key == GLUT_KEY_LEFT) {blockX -= stepSize;}if (key == GLUT_KEY_RIGHT) {blockX += stepSize;}// 边界检测,让矩形没法超出边界if (blockY > (1.0f - blockSize * 2)) {blockY = 1.0f - blockSize * 2;}if (blockY < -1.0f) {blockY = -1.0f;}if (blockX < -1.0f) {blockX = -1.0f;}if (blockX > (1.0f - blockSize * 2)) {blockX = 1.0f - blockSize * 2;}// 设置下个位置的4个顶点坐标// 左下⾓vVerts[0] = blockX;vVerts[1] = blockY;// 右下⾓vVerts[3] = blockX + blockSize * 2;vVerts[4] = blockY;// 右上⾓vVerts[6] = blockX + blockSize * 2;vVerts[7] = blockY + blockSize * 2;// 左上⾓vVerts[9] = blockX;vVerts[10] = blockY + blockSize * 2;// 批次更新存储属性,顶点数据squareBatch.CopyVertexData3f(vVerts);}/*参数key表⽰按键的唯⼀标识,(x,y)是发⽣按键事件时⿏标点所处位置(以左上⾓为起点)上下左右箭头按键分别对应的key值为:GLUT_KEY_UP、GLUT_KEY_DOWN、GLUT_KEY_LEFT、GLUT_KEY_RIGHT*/void SpecialKeys(GLint key, GLint x, GLint y) {///(⾃定义函数)// 计算下⼀个矩形位置BourceFunction(key);/// GLUT// 触发重画事件 RenderSceneglutPostRedisplay();}// 1 程序⼊⼝int main(int argc, char *argv[]) {/// GLTools// 设置当前⼯作⽬录,针对Mac OS XgltSetWorkingDirectory(argv[0]);/// GLUT// 初始化GLUT库glutInit(&argc, argv);/// GLUT// 初始化渲染模式,其中标志GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCIL分别指双缓冲窗⼝、RGBA颜⾊模式、深度测试、模板缓冲区 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);/// GLUT// 初始化窗⼝⼤⼩glutInitWindowSize(800, 720);/// GLUT// 创建窗⼝glutCreateWindow("Triangle");/// GLUT// 注册回调函数,拦截窗⼝⼤⼩变化消息,ChangeSize是⾃定义⽅法名glutReshapeFunc(ChangeSize);/// GLUT// 注册回调函数,拦截窗⼝渲染消息,RenderScene是⾃定义⽅法名glutDisplayFunc(RenderScene);/// GLUT/*这⾥是键盘特殊按键点击回调注册(glutSpecialFunc)GLUT语法中,特殊按键指功能键或者⽅向键(上下左右箭头键等)它还有另⼀个键盘普通按键点击的回调注册(glutKeyboardFunc),⽐如空格键*/// 注册键盘特殊按键点击回调函数glutSpecialFunc(SpecialKeys);/// glew// 确保驱动程序的初始化中没有出现任何问题GLenum err = glewInit();if (GLEW_OK != err) {/// glewfprintf(stderr, "glew erroe:%s\n", glewGetErrorString(err));return1;}/// (⾃定义函数)// 初始化设置SetupRC();/// GLUT// 进⼊调⽤循环glutMainLoop();return0;}#pragma mark - 启动程序,调⽤函数的顺序/*1 主函数int main(int argc, char *argv[])2 为程序做⼀次性的设置void SetupRC()3 窗⼝⼤⼩改变时接受新的宽度和⾼度void ChangeSize(int w, int h)4 开始渲染void RenderScene(void)*/#pragma mark - 拖动窗⼝,调⽤函数的顺序/*1 窗⼝⼤⼩改变时接受新的宽度和⾼度void ChangeSize(int w, int h)2 开始渲染void RenderScene(void)*/#pragma mark - 键盘按动,调⽤函数的顺序/*1、void SpecialKeys(GLint key, GLint x, GLint y)2、void BourceFunction(int key)3、void RenderScene(void)*/#pragma mark - 全局变量的操作/*1 定义批次GLBatch squareBatch;2 属性设置squareBatch.Begin(GL_TRIANGLES, 3);squareBatch.CopyVertexData3f(vVerts);squareBatch.End();3 启⽤绘制功能squareBatch.Draw();4 顶点数据的更改squareBatch.CopyVertexData3f(vVerts);5 重新启⽤绘制功能squareBatch.Draw();*//*1 定义着⾊管理器GLShaderManager shaderManager;2 初始化着⾊管理器shaderManager.InitializeStockShaders();3 使⽤着⾊管理器渲染eStockShader(GLT_SHADER_IDENTITY, vRed); */#pragma mark - 关键函数的理解代码运⾏后的效果图如下图所⽰:然后按键盘的上下左右⽅向键是可以移动中间的四边形的。

CodeBlocks + OpenGL + GLUT + Freeglut + GLEW开发环境搭建_V1.1

CodeBlocks + OpenGL + GLUT + Freeglut + GLEW开发环境搭建_V1.1

◆ 建立项目:
1、 File New Project :
2、 在弹出的窗口中,选择 GLUT project ,点击 Go:
3、 在弹出的窗口中,默认,点击 Next:
4、 修改 Project Title 和项目本地路径,点击 Next :
下面的项会自动生成:
5、 让 CodeBlocks 知道我们存放 OpenGL 的位置,我们之前已经把 GLUT、 GLEW 头文件和库分别放置在 MinGW 下的 include 和 lib 下,根据提示, 我们应该设置 GLUT 的本地目录为 include 和 lib 的父目录,即 MinGW, 然后点击 Next :
到这里,GLUT 配置成功。
测试 GLEW : 我们自己再 Copy 一段 GLEW 相关的 C 代码,测试下 GLEW 相关接口,代码 如下: #include <gl/glew.h> #include <gl/glut.h> // 用于在窗口中绘制需要的图形 void RenderScene(void)
Files Files
运行这个脚本,GLUT、GLEW 的包就被部署到相应的目录,而不需要挨个手 动去复制粘贴。
建立项目
个人初期尝试时,直接生成一个.c 源文件,用 CodeBlocks 打开,编译不通 过, 应该是头文件和库配置不正确, 尝试无果。 前面已经说了, CodeBlocks 对 GLUT 的支持比较好,我们可以直接在 CodeBlocks 中建立 GLUT 项目:
按 F9 编译并运行,如果成功,会出现如下的显示窗口:
至此, GLEW 库也验证成功。
注: 如果读者运行的窗口背景不是白色而是黑色,中间的红色长方形周边有白 条的话, 最好不要试图从代码对错入手, 有可能是驱动没有安装对或者你的显卡 对 OpenGL 的支持不好。 像笔者用的某品牌的笔记本, 用知名驱动辅助软件、 或某安全软件自带的驱 动管理软件安装的某品牌集成显卡的最新显卡驱动,就会出现这样的问题。 这时候, 笔者的显卡驱动也不支持回滚了。 笔者想从笔记本电脑官网下载集 成显卡稳定的低版本驱动并安装, 安装好, 重启前, 用程序测试, 正常, 重启后, 程序又不正常。查看驱动版本,驱动版本依然为最新的显卡版本,说明显卡驱动 只支持向上升级,不支持向下降级。想到设备管理器中去回滚显卡驱动程序,显 卡回滚操作的按钮为暗,不支持。 这时笔者想到的办法就是在设备管理器中卸载显卡驱动, 卸载完重启, 系统 自动安装系统标准 VGA 显卡驱动,程序正常。安装集成显卡官方驱动不正常, 而安装系统标准 VGA 驱动就正常,原因未解。 因显卡是集成显卡,可能在这方面对 OpenGL 的支持不好,有的显卡不支持 比较新的 OpenGL 版本,而我们用的 GLEW 的版本较新。在这个笔记本电脑上装 ARM Mali OpenGL ES 3.0 emulator 的仿真器,仿真器也不能正常运行,但是在作 者个人装独立显卡的一体机上, 就不会出现这样的问题。 读者要根据自己显卡, 选择合适的 OpenGL 版本进行安装。

glut教程9--GLUT鼠标

glut教程9--GLUT鼠标

GLUT教程(九)GLUT鼠标收藏在前几节,我们看了怎么使用GLUT的keyboard函数,来增加一个OpenGL程序的交互性。

现在,是时候研究下鼠标了。

GLUT的鼠标接口提供一些列的选项来增加鼠标的交互性。

也就是检测鼠标单击,和鼠标移动。

检测鼠标Clicks和键盘处理一样,GLUT为你的注册函数(也就是处理鼠标clicks事件的函数)提供了一个方法。

函数glutMouseFunc,这个函数一般在程序初始化阶段被调用。

函数原型如下:void glutMouseFunc(void(*func)(int button,int state,int x,int y));参数:func:处理鼠标click事件的函数的函数名。

从上面可以看到到,处理鼠标click事件的函数,一定有4个参数。

第一个参数表明哪个鼠标键被按下或松开,这个变量可以是下面的三个值中的一个:GLUT_LEFT_BUTTONGLUT_MIDDLE_BUTTONGLUT_RIGHT_BUTTON第二个参数表明,函数被调用发生时,鼠标的状态,也就是是被按下,或松开,可能取值如下:GLUT_DOWNGLUT_UP当函数被调用时,state的值是GLUT_DOWN,那么程序可能会假定将会有个GLUT_UP事件,甚至鼠标移动到窗口外面,也如此。

然而,如果程序调用glutMouseFunc传递NULL作为参数,那么GLUT将不会改变鼠标的状态。

剩下的两个参数(x,y)提供了鼠标当前的窗口坐标(以左上角为原点)。

检测动作(motion)GLUT 提供鼠标motion检测能力。

有两种GLUT处理的motion:active motion和passive motion。

Active motion是指鼠标移动并且有一个鼠标键被按下。

Passive motion是指当鼠标移动时,并有没鼠标键按下。

如果一个程序正在追踪鼠标,那么鼠标移动期间,没一帧将产生一个结果。

OpenGL介绍

OpenGL介绍
OpenGL实用库
glaux.h: OpenGL扩展库 glut.h: OpenGL实用工具包 #include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h> #include <GL/glut.h>
此外,OpenGL还提供了反走样技术,能够实现深度暗示(Depth Cue)、运动模糊(Motion Blur)、雾化(Fog)等特殊效果。
6.1.3 OpenGL的绘制流程和原理
点数据 评价器 逐点操作 基元匹配 基片 操作
显示 列表
像素 数据 像素操作
光栅化
帧缓冲区
纹理存储器
OpenGL指令从左侧进入OpenGL,有两类数据,分别是由顶点描述的几何模 型和由像素描述的位图、影像等模型,其中后者经过像素操作后直接进入光栅 化。评价器(Evaluator)用于处理输入的模型数据,例如对顶点进行转换、光照, 并把图元剪切到视景体中,为下一步光栅化做好准备。显示列表(Display List) 用于存储一部分指令,留待合适时间以便于快速处理。光栅化将图元转化成二 维操作,并计算结果图像中每个点的颜色和深度等信息,产生一系列图像的帧 缓存描述值,其生成结果称为基片(Fragment)。基片操作主要的有帧缓存的更 新、测试、融合和屏蔽操作,以及基片之间的逻辑操作和抖动(Dithering)。
第6章 OpenGL
6.1 基本介绍
6.1.1 背景情况
OpenGL(Open Graphics Library,即开放性图形库)是以SGI的 GL三维图形库为基础制定的一个开放式三维图形标准。SGI在 1992年7月发布了1.0版。 OpenGL 规 范 由 ARB(OpenGL Architecture Review Board, OpenGL结构评审委员会)负责管理,目前加入OpenGL ARB的 成员有SGI、Microsoft、Intel、IBM、SUN、Compaq、HP等公 司,它们均采用了OpenGL图形标准,许多软件厂商以OpenGL 为基础开发自己的产品,硬件厂商提供对OpenGL的支持。由 于OpenGL的广泛应用,它已经成为一个工业标准。

OpenGL入门教程(精)

OpenGL入门教程(精)

OpenGL 入门教程1.第一课:说起编程作图,大概还有很多人想起TC 的#include < graphics.h>吧?但是各位是否想过,那些画面绚丽的PC 游戏是如何编写出来的?就靠TC 那可怜的640*480 分辨率、16 色来做吗?显然是不行的。

本帖的目的是让大家放弃TC 的老旧图形接口,让大家接触一些新事物。

OpenGL 作为当前主流的图形API 之一,它在一些场合具有比DirectX 更优越的特性。

1、与C 语言紧密结合。

OpenGL 命令最初就是用C 语言函数来进行描述的,对于学习过C 语言的人来讲,OpenGL 是容易理解和学习的。

如果你曾经接触过TC 的graphics.h,你会发现,使用OpenGL 作图甚至比TC 更加简单。

2、强大的可移植性。

微软的Direct3D 虽然也是十分优秀的图形API,但它只用于Windows 系统(现在还要加上一个XBOX 游戏机)。

而OpenGL 不仅用于Windows,还可以用于Unix/Linux 等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。

并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关。

3、高性能的图形渲染。

OpenGL 是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL 提供强力支持,激烈的竞争中使得OpenGL 性能一直领先。

总之,OpenGL 是一个很NB 的图形软件接口。

至于究竟有多NB,去看看DOOM 3 和QUAKE4 等专业游戏就知道了。

OpenGL 官方网站(英文)下面我将对Windows 下的OpenGL 编程进行简单介绍。

学习OpenGL 前的准备工作第一步,选择一个编译环境现在Windows 系统的主流编译环境有V isual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL 的。

但这里我们选择V isual Studio 2005 作为学习OpenGL 的环境。

使用opengl程序绘制实线虚线和点划线

使用opengl程序绘制实线虚线和点划线

使用opengl程序绘制实线虚线和点划线OpenGL是一种用于绘制2D和3D图形的跨平台编程接口。

它提供了一套功能强大的函数和工具,可以在各种显示设备上渲染图形。

在OpenGL中,可以使用不同的绘制模式来绘制实线、虚线和点划线。

本文将介绍如何使用OpenGL程序实现这些效果。

在开始之前,我们首先需要安装OpenGL库和开发环境。

OpenGL可以在不同的平台上使用,例如Windows、Linux和macOS。

对于Windows用户,可以使用MinGW或者MSYS2等工具链来配置开发环境。

对于Linux和macOS用户,可以使用GCC和Xcode来配置开发环境。

安装完成后,我们可以开始编写OpenGL程序。

在OpenGL中,绘图是通过一系列函数和状态来实现的。

以下是一个基本的OpenGL程序的框架:```cpp#include <GL/glut.h>void displa//清空屏幕glClear(GL_COLOR_BUFFER_BIT);//设置绘图颜色glColor3f(1.0f, 1.0f, 1.0f);//绘制实线glBegin(GL_LINES);glVertex2f(-0.5f, 0.0f);glVertex2f(0.5f, 0.0f);glEnd(;//绘制虚线//...//绘制点划线//...//刷新缓冲区glutSwapBuffers(;int main(int argc, char** argv)// 初始化窗口和OpenGL环境glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE , GLUT_RGB); glutInitWindowSize(800, 600); glutCreateWindow("OpenGL Program");//注册绘图函数glutDisplayFunc(display);//进入主循环glutMainLoop(;return 0;```在以上程序中,`glClear(GL_COLOR_BUFFER_BIT)`用于清空屏幕,`glColor3f(1.0f, 1.0f, 1.0f)`用于设置绘图颜色。

用OpenGL进行曲线、曲面的绘制

⽤OpenGL进⾏曲线、曲⾯的绘制实验⽬的理解Bezier曲线、曲⾯绘制的基本原理;理解OpenGL中⼀维、⼆维插值求值器的⽤法。

掌握OpenGL中曲线、曲⾯绘图的⽅法,对⽐不同参数下的绘图效果差异;代码1:⽤四个控制点绘制⼀条三次Bezier曲线#include "stdafx.h"#include <stdlib.h>#include <time.h>#include <GL/glut.h>//4个控制点的3D坐标——z坐标全为0GLfloat ctrlpoints[4][3] = {{ -4, -4, 0 }, { -2, 4, 0 }, { 2, -4, 0 }, { 4, 4, 0 }};void init(void){//背景⾊glClearColor(0.0, 0.0, 0.0, 1.0);//将控制点坐标映射为曲线坐标//参数1:GL_MAP1_VERTEX_3,3维点坐标//参数2和3:控制参数t或u的取值范围[0, 1]//参数4:曲线内插值点间的步长3————3维坐标//参数5:曲线间的补偿为顶点数4个————总步长为12//参数6:控制点⼆维数组⾸元素地址//注意: 若是在这⾥设置了相关参数,后续对ctrlpoints内容更改曲线不变glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);//打开开关——允许3维坐标控制点到参数点转换开关glEnable(GL_MAP1_VERTEX_3);glShadeModel(GL_FLAT);//代码开关2:去掉本注释,可启⽤反⾛样/*glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH); //允许直线反⾛样glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST); // Antialias the linesglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);*/}void display(void){int i;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 1.0, 1.0);//代码开关1:去掉本注释,查看动态的曲线绘图效果:动态更新控制点坐标/*for(int t = 0; t < 4; t++) {for(int j = 0; j < 3; j++)ctrlpoints[t][j] = (rand() % 1024 / 1024.0 - 0.5) * 10;}//动态映射glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);*/glLoadIdentity();glColor3f(1.0, 0.0, 0.0);//绘制连续线段glBegin(GL_LINE_STRIP);//参数t或u取值为i/30,共计31个点for (i = 0; i <= 30; i++)glEvalCoord1f((GLfloat)i / 30.0); //根据4个控制点坐标的参数化插值glEnd();/* 显⽰控制点 */glPointSize(5.0);glBegin(GL_POINTS);for (i = 0; i < 4; i++)glVertex3fv(&ctrlpoints[i][0]);glEnd();glTranslatef(-0.1f, 0.1f, 0.0f);glColor3f(0.0, 1.0, 0.0);//glLineWidth(2.0);//绘制连续线段——线段数越多,曲线越光滑glBegin(GL_LINE_STRIP);//设置参数t或u取值为i/60,共计61个点//实验:若让t从-2变化到+2,可看到什么效果for (i = 0; i <= 60; i++)glEvalCoord1f((GLfloat)i / 60.0); //根据4个控制点坐标的参数化插值glEnd();glTranslatef(-0.1f, 0.1f, 0.0f);glColor3f(1.0, 1.0, 1.0);//绘制连续线段glBegin(GL_LINE_STRIP);//设置参数t或u取值为i/60,共计61个点//实验:若让t从-2变化到+2,可看到什么效果for (i = 0; i <= 100; i++)glEvalCoord1f((GLfloat)i / 100.0);glEnd();glutSwapBuffers();}//3D空间中绘制2D效果,采⽤正交投影void reshape(GLsizei w, GLsizei h){glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-5.0, 5.0, -5.0*(GLfloat)h / (GLfloat)w, 5.0*(GLfloat)h / (GLfloat)w, -5.0, 5.0);elseglOrtho(-5.0*(GLfloat)w / (GLfloat)h, 5.0*(GLfloat)w / (GLfloat)h, -5.0, 5.0, -5.0, 5.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void keyboard(unsigned char key, int x, int y){switch (key){case'x':case'X':case27: //ESC键exit(0);break;default:break;}}int main(int argc, char** argv){srand((unsigned int)time(0));glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);//使⽤双缓存模式和深度缓存 glutInitWindowSize(800, 800);glutInitWindowPosition(0, 0);glutCreateWindow("2D Bezier曲线");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutIdleFunc(display);//设置空闲时调⽤的函数glutMainLoop();return0;}此时我们打开代码开关1,查看动态Bezier曲线绘制效果:关闭代码开关1,打开代码开关2,查看直线反⾛样效果:对⽐刚开始的效果图,我们发现,使⽤了直线反⾛样后,绘制出的曲线很光滑,看着很舒服。

OpenGL常用API

glAccum 操作累加缓冲区glAddSwapHintRectWIN 定义一组被SwapBuffers拷贝的三角形glAlphaFunc允许设置alpha检测功能glAreTexturesResident 决定特定的纹理对象是否常驻在纹理内存中glArrayElement 定义一个被用于顶点渲染的数组成分glBegin,glEnd 定义一个或一组原始的顶点glBindTexture 允许建立一个绑定到目标纹理的有名称的纹理glBitmap 绘制一个位图glBlendFunc 特殊的像素算法glCallList 执行一个显示列表glCallLists 执行一列显示列表glClear 用当前值清除缓冲区GlClearAccum 为累加缓冲区指定用于清除的值glClearColor 为色彩缓冲区指定用于清除的值glClearDepth 为深度缓冲区指定用于清除的值glClearStencil 为模板缓冲区指定用于清除的值glClipPlane 定义被裁剪的一个平面几何体glColor 设置当前色彩glColorMask 允许或不允许写色彩组件帧缓冲区glColorMaterial 使一个材质色彩指向当前的色彩glColorPointer 定义一列色彩glColorTableEXT 定义目的一个调色板纹理的调色板的格式和尺寸glColorSubTableEXT 定义目的纹理的调色板的一部分被替换glCopyPixels 拷贝帧缓冲区里的像素glCopyTexImage1D 将像素从帧缓冲区拷贝到一个单空间纹理图象中glCopyTexImage2D 将像素从帧缓冲区拷贝到一个双空间纹理图象中glCopyTexSubImage1D 从帧缓冲区拷贝一个单空间纹理的子图象glCopyTexSubImage2D 从帧缓冲区拷贝一个双空间纹理的子图象glCullFace 定义前面或后面是否能被精选glDeleteLists 删除相邻一组显示列表glDeleteTextures 删除命名的纹理glDepthFunc 定义用于深度缓冲区对照的数据glDepthMask 允许或不允许写入深度缓冲区glDepthRange 定义z值从标准的设备坐标映射到窗口坐标glDrawArrays 定义渲染多个图元glDrawBuffer 定义选择哪个色彩缓冲区被绘制glDrawElements 渲染数组数据中的图元glDrawPixels 将一组像素写入帧缓冲区glEdgeFlag 定义一个边缘标志数组glEdgeFlagPointer 定义一个边缘标志数组glEnable, glDisable 打开或关闭OpenGL的特殊功能glEnableClientState,glDisableClientState 分别打开或关闭数组glEvalCoord 求解一维和二维贴图glEvalMesh1,glEvalMesh2 求解一维和二维点或线的网格glEvalPoint1,glEvalPoint2 生成及求解一个网格中的单点glFeedbackBuffer 控制反馈模式glFinish 等待直到OpenGL执行结束glFlush 在有限的时间里强制OpenGL的执行glFogf,glFogi,glFogfv,glFogiv 定义雾参数glFrontFace 定义多边形的前面和背面glFrustum 当前矩阵乘上透视矩阵glGenLists 生成一组空的连续的显示列表glGenTextures 生成纹理名称glGetBooleanv,glGetDoublev,glGetFloatv,glGetIntegerv 返回值或所选参数值glGetClipPlane 返回特定裁减面的系数glGetColorTableEXT 从当前目标纹理调色板得到颜色表数据glGetColorTableParameterfvEXT,glGetColorTableParameterivEXT 从颜色表中得到调色板参数glGetError 返回错误消息glGetLightfv,glGetLightiv 返回光源参数值glGetMapdv,glGetMapfv,glGetMapiv 返回求值程序参数glGetMaterialfv,glGetMaterialiv 返回材质参数glGetPixelMapfv,glGetpixelMapuiv,glGetpixelMapusv 返回特定的像素图glGetPointerv 返回顶点数据数组的地址glGetPolygonStipple 返回多边形的点图案glGetString 返回描述当前OpenGl连接的字符串glGetTexEnvfv 返回纹理环境参数glGetTexGendv,glGetTexGenfv,glGetTexGeniv 返回纹理坐标生成参数glGetTexImage 返回一个纹理图象glGetTexLevelParameterfv,glGetTexLevelParameteriv 返回特定的纹理参数的细节级别glGetTexParameterfv,glGetTexParameteriv 返回纹理参数值glHint 定义实现特殊的线索glIndex 建立当前的色彩索引glIndexMask 控制写色彩索引缓冲区里的单独位GlIndexPointer 定义一个颜色索引数组glInitName 初始化名字堆栈glInterleavedArrays 同时定义和允许几个在一个大的数组集合里的交替数组glIsEnabled 定义性能是否被允许glIsList 检测显示列表的存在glIsTexture 确定一个名字对应一个纹理glLightf,glLighti,glLightfv,glLightiv 设置光源参数glLightModelf,glLightModeli,glLightModelfv,glLightModeliv 设置光线模型参数glLineStipple 设定线点绘图案glLineWidth 设定光栅线段的宽glListBase 为glcallList设定显示列表的基础glLoadIdentity 用恒等矩阵替换当前矩阵glLoadMatrixd,glLoadMatrif 用一个任意矩阵替换当前矩阵glLoadName 将一个名字调入名字堆栈glLogicOp 为色彩索引渲染定义一个逻辑像素操作glMap1d,glMap1f 定义一个一维求值程序glMap2d,glMap2f 定义一个二维求值程序glMapGrid1d,glMapGrid1f,glMapgrid2d,glMapGrid2f 定义一个一维或二维网格glMaterialf,glMateriali,glMateriafv,glMaterialiv 为光照模型定义材质参数glMatrixMode 定义哪一个矩阵是当前矩阵glMultMatrixd,glMultMatrixf 用当前矩阵与任意矩阵相乘glNewList,glEndList 创建或替换一个显示列表glNormal 设定当前顶点法向glNormalPointer 设定一个法向数组glOrtho 用垂直矩阵与当前矩阵相乘glPassThrough 在反馈缓冲区做记号glPixelMapfv,glPixelMapuiv,glPixelMapusv 设定像素交换图glPixelStoref,glpixelStorei 设定像素存储模式glPixelTransferf,glPixelTransferi 设定像素存储模式glPixelZoom 设定像素缩放因数glPointSize 设定光栅点的直径glPolygonMode 选择一个多边形的光栅模式glPolygonOffset 设定OpenGL用于计算深度值的比例和单元glPolygonStipple 设定多边形填充图案glPrioritizeTextures 设定纹理固定的优先级glPushAttrib,glPopAttrib 属性堆栈的压入和弹出操作glPushClientAttrib,glPopClientAttrib 在客户属性堆栈存储和恢复客户状态值glPushmatrix,glPopMatrix 矩阵堆栈的压入和弹出操作glPushName,glPopName 名字堆栈的压入和弹出操作glRasterPos 定义像素操作的光栅位置glreadBuffer 为像素选择一个源色彩缓冲区glReadPixels 从帧缓冲区读取一组数据glRectd,glRectf,glRecti,glRects,glRectdv,glRectfv,glRectiv,glRectsv 绘制一个三角形glRenderMode定义光栅模式glRotated,glRotatef 将旋转矩阵与当前矩阵相乘glScaled,glScalef 将一般的比例矩阵与当前矩阵相乘glScissor 定义裁减框glSelectBuffer 为选择模式值建立一个缓冲区glShadeModel 选择平直或平滑着色glStencilFunc 为模板测试设置功能和参照值glStencilMask 控制在模板面写单独的位glStencilOp 设置激活模式测试glTexCoord 设置当前纹理坐标glTexCoordPointer 定义一个纹理坐标数组glTexEnvf,glTexEnvi,glTexEnvfv,glTexEnviv 设定纹理坐标环境参数glTexGend,glTexgenf,glTexGendv,glTexGenfv,glTexGeniv 控制纹理坐标的生成glTexImage1D 定义一个一维的纹理图象glTexImage2D 定义一个二维的纹理图glTexParameterf,glTexParameteri,glTexParameterfv,glTexParameteriv 设置纹理参数glTexSubImage1D 定义一个存在的一维纹理图像的一部分,但不能定义新的纹理glTexSubImage2D 定义一个存在的二维纹理图像的一部分,但不能定义新的纹理glTranslated,glTranslatef 将变换矩阵与当前矩阵相乘glVertex 定义一个顶点glVertexPointer 设定一个顶点数据数组glViewport 设置视窗[OpenGL应用函数库]gluBeginCurve,gluEndCurve 定义一条不一至的有理的NURBS曲线gluBeginPolygon,gluEndPolygon 定义一个非凸多边形gluBeginSurface,gluEndSurface 定义一个NURBS曲线gluBeginTrim,gluEndTrim 定义一个NURBS整理循环gluBuild1Dmipmaps 建立一维多重映射gluBuild2Dmipmaps 建立二维多重映射gluCylinder 绘制一个圆柱gluDeleteNurbsRenderer 删除一个NURBS对象gluDeleQuadric 删除一个二次曲面对象gluDeleteTess 删除一个镶嵌对象gluDisk 绘制一个盘子gluErrorString 根据OpenGL或GLU错误代码产生错误字符串gluGetNutbsProperty 得到一个NURBS属性gluGetString 得到一个描述GLU版本号或支持GLU扩展调用的字符串gluGetTessProperty 得到一个镶嵌对象gluLoadSamplingMatrices 加载NUMRBS例子和精选矩阵gluLookAt 设定一个变换视点gluNewNurbsRenderer 创建一个NURBS对象gluNewQuadric 建立一个二次曲面对象gluNewTess 建立一个镶嵌对象gluNextContour 为其他轮廓的开始做标记gluNurbsCallback 为NURBS对象设定一个回调gluNnrbsCurve 设定一个NuRBS曲线的形状gluNurbsProperty 设定一个NURBS属性gluNurbsSurface 定义一个NURBS表面的形状gluOrtho2D 定义一个二位正交投影矩阵gluPartialDisk 绘制一个盘子的弧gluPerspective 设置一个透视投影矩阵gluPickMatrix 定义一个拾取区间gluProject 将对象坐标映射为窗口坐标gluPwlCurve 描述一个分段线性NURBS修剪曲线gluQuadricCallback 为二次曲面对象定义一个回调gluQuadricDrawStyle. 为二次曲面设定合适的绘制风格gluQuadricNormals 定义二次曲面所用的法向的种类gluQuadricOrientation 定义二次曲面内部或外部方向gluQuadricTexture 定义是否带二次其面做纹理帖图gluScaleImage 将图象变换为任意尺寸gluSphere 绘制一个球体gluTessBeginContour,gluTessEndContour 划定一个边界描述gluTessBeginPolygon,gluTessEndPolygon 划定一个多边形描述gluTessCallback 为镶嵌对象定义一个回调gluTessNormal 为一个多边行形定义法向gluTessProperty 设置镶嵌对象的属性gluTessVertex 定义在一个多边形上的顶点gluUnProject 将窗口坐标映射为对象坐标。

OpenGL常见问题


问题 3
GL的平台简介: 基于OpenGL标准开发的应用程序必须运行于32位Windows 平台下,如WindowsNT或Windows95环境;而且运行时还需有动态 链接库OpenGL32.DLL、Glu32.DLL,一般在…\WINDOWS\system32里面 (注:window2000以上系统均带有OPENGL32.DLL和glu32.dll)
specification :
– The OpenGL Utility Toolkit (GLUT) Programming Interface (PDF) – OpenGL 2.1 specification (PDF)
book:
– OpenGL Shading Language – Openglredbook
问题 5
OpenGL的几个常用库的编程风格? 1、基本库( gl.h ): glBegin, glClear, glCopyPixels, GLint 2、 实用函数库( glu.h ) : gluOrtho2D 3、实用函数工具包(glut.h) : glutInit, glutInitWindowsPosition
问题 6
如何使用MFC+OpenGL编程? 解答: 1、演示程序。 2、 MFC下OpenGL编程与控制台程序没有本 质上的差别。 3、详细参考: /phinecos/articles/83 4916.html
问题 7
如何循序渐进学习OpenGL? 建议: 1、读已有的程序,在其基础上修改运行, 推荐redbook.zip。 2、读经典的OpenGL教程,推荐 Openglredbook。 3、针对性的研究问题,查阅资料,深入学 习。
问题 2
在没使用GLUT的情况下, 在VC6.0下如何配置 OpenGL? 解答:

OpenGL曲线、曲面的绘制与3D模型的装载与显示

实验7 OpenGL曲线、曲面的绘制与3D模型的装载与显示实验目的:1)理解Bezier曲线、曲面绘制的基本原理;理解OpenGL中一维、二维插值求值器的用法。

2)掌握OpenGL中曲线、曲面绘图的方法,对比不同参数下的绘图效果差异;实验要求:1)教师领读代码;2)学生上机实验;3)针对代码1,分别或同时去掉开关1和开关2的代码注释,查看并记录实验效果;用公式说明Bezier曲线、曲面的绘制计算过程;4)针对代码2,分别或同时去掉各开关,观察并记录显示效果差异;用公式说明Bezier曲面插值点的计算过程;说明线框模型与曲面模型的区别;5)针对代码3:实验和观察材质参数、光照参数、坐标参数对实验效果的影响;6)理解均匀与非均匀样条有理曲线或曲面的差异;7)针对代码4:掌握非均匀有理B样条曲面(NURBS曲面)的曲面绘制方法;8)阅读https:///sweetdark/blog/184313代码,编写曲面裁剪和细分曲面的效果。

9)OpenGL如何装载并显示3D MAX导出的3D模型实验及代码,课外自行完成。

代码1:用四个控制点绘制一条三次Bezier曲线://Demo: 用四个控制顶点来画一条三次Bezier曲线#include <stdlib.h>#include <time.h>#include <GL/glut.h>//4个控制点的3D坐标——z坐标全为0GLfloatctrlpoints[4][3] = {{-4, -4, 0}, {-2, 4, 0}, {2, -4, 0}, {4, 4, 0}};voidinit(void){//背景色glClearColor(0.0, 0.0, 0.0, 1.0);//将控制点坐标映射为曲线坐标//参数:GL_MAP1_VERTEX_3,3维点坐标//参数2和3:控制参数t或u的取值范围[0, 1]//参数4:曲线内插值点间的步长3——3维坐标//参数5:曲线间的补偿为顶点数4个——总步长为12//参数6:控制点二维数组首元素地址//note: 若是在这里设置了相关参数,后续对ctrlpoints内容更改曲线不变glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);//打开开关——允许3维坐标控制点到参数点转换开关glEnable(GL_MAP1_VERTEX_3);glShadeModel(GL_FLAT);//代码开关2:去掉本注释,可启用反走样/*glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH); //允许直线反走样glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST); // Antialias the linesglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);*/}void display(void){int i;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 1.0, 1.0);//代码开关1:去掉本注释,查看动态的曲线绘图效果:动态更新控制点坐标/*for(int t = 0; t < 4; t++) {for(int j = 0; j < 3; j++)ctrlpoints[t][j] = (rand() % 1024 / 1024.0 - 0.5) * 10;}//动态映射glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);*/glLoadIdentity();glColor3f(1.0, 0.0, 0.0);//绘制连续线段glBegin(GL_LINE_STRIP);//参数t或u取值为i/30,共计31个点for (i = 0; i <= 30; i++)glEvalCoord1f((GLfloat) i/30.0); //根据4个控制点坐标的参数化插值glEnd();/* 显示控制点*/glPointSize(5.0);glBegin(GL_POINTS);for (i = 0; i < 4; i++)glVertex3fv(&ctrlpoints[i][0]);glEnd();glTranslatef(-0.1f,0.1f,0.0f);glColor3f(0.0, 1.0, 0.0);//glLineWidth(2.0);//绘制连续线段——线段数越多,曲线越光滑glBegin(GL_LINE_STRIP);//设置参数t或u取值为i/60,共计61个点//实验:若让t从-2变化到+2,可看到什么效果for (i = 0; i <= 60; i++)glEvalCoord1f((GLfloat) i/60.0); //根据4个控制点坐标的参数化插值glEnd();glTranslatef(-0.1f,0.1f,0.0f);glColor3f(1.0, 1.0, 1.0);//绘制连续线段glBegin(GL_LINE_STRIP);//设置参数t或u取值为i/60,共计61个点//实验:若让t从-2变化到+2,可看到什么效果for (i = 0; i <= 100; i++)glEvalCoord1f((GLfloat) i/100.0);glEnd();glutSwapBuffers();}//3D空间中绘制2D效果,采用正交投影void reshape(GLsizei w, GLsizei h){glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w, 5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0);elseglOrtho(-5.0*(GLfloat)w/(GLfloat)h, 5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void keyboard(unsigned char key, int x, int y){//请参考"变换示例参考"一文,考虑添加键盘命令,交互式来控制金字塔的旋转switch (key){case 'x':case 'X':case 27: //ESC键exit(0);break;default:break;}}int main(intargc, char** argv){srand( (unsigned int)time(0) );glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);//使用双缓存模式和深度缓存glutInitWindowSize(800, 800);glutInitWindowPosition(0, 0);glutCreateWindow("2D Bezier曲线");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutIdleFunc(display);//设置空闲时调用的函数glutMainLoop();return 0;}效果图:动态曲线绘制效果图:关闭代码开关1,打开代码开关2,查看直线反走样效果:对比分析反走样前后曲线绘制效果差异。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OpenGL 中常用的GLUT 函数库GLUT函数说明一、初始化void glutInit(int* argc,char** argv)这个函数用来初始化GLUT库。

对应main 函数的形式应是:int main(int argc,char* argv[]);这个函数从main 函数获取其两个参数。

1void glutInitWindowSize(int width,int height);2voidglutInitWindowPosition(int x,int y);设置glut程序要产生的窗口的大小和位置(左上角)。

以像素为单位。

void glutInitDisplayMode(unsigned int mode);设置图形显示模式。

参数mode的可选值为:∙GLUT_RGBA:当未指明GLUT-RGBA或GLUT-INDEX时,是默认使用的模式。

表明欲建立RGBA模式的窗口。

∙GLUT_RGB:与GLUT-RGBA作用相同。

∙GLUT_INDEX:指明为颜色索引模式。

∙GLUT_SINGLE:只使用单缓存∙GLUT_DOUBLE:使用双缓存。

以避免把计算机作图的过程都表现出来,或者为了平滑地实现动画。

∙GLUT_ACCUM:让窗口使用累加的缓存。

∙GLUT_ALPHA:让颜色缓冲区使用alpha组件。

∙GLUT_DEPTH:使用深度缓存。

∙GLUT_STENCIL:使用模板缓存。

∙GLUT_MULTISAMPLE:让窗口支持多例程。

∙GLUT_STEREO:使窗口支持立体。

GLUT_LUMINACE: luminance是亮度的意思。

但是很遗憾,在多数Ope nGL平台上,不被支持。

二、事件处理(Event Processing)void glutMainLoop(void)让glut 程序进入事件循环。

在一个glut程序中最多只能调用一次。

一旦调用,会直到程序结束才返回。

三、窗口管理(Window Management)int glutCreateWindow(char* name);产生一个顶层的窗口。

name 作为窗口的名字,也就是窗口标题栏显示的内容。

返回值是生成窗口的标记符,可用函数glutGetWindow()加以引用。

int glutCreateSubWindow(int win,int x,int y,int width,int height);创建一个子窗口。

win是其父窗口的标记符。

x,y是相对父窗口的位移,以像素表示。

width,height是子窗口的宽和高。

void glutSetWindow(int win);int glutGetWindow(void);功能分别是:设置标记符为win的窗口为当前窗口;返回当前窗口的标记符。

void glutDestroyWindow(int win);销毁以win 标记的窗口。

void glutPostRedisplay(void);将当前窗口打上标记,标记其需要再次显示。

void glutSwapBuffers(void);当窗口模式为双缓存时,此函数的功能就是把后台缓存的内容交换到前台显示。

当然,只有单缓存时,使用它的功能跟用glFlush()一样。

而使用双缓存是为了把完整图画一次性显示在窗口上,或者是为了实现动画。

void glutPositionWindow(int x,int y);改变当前窗口的位置:当前窗口是顶层窗口时,x,y是相对于屏幕的的位移;当前窗口若是子窗口时,x,y是相对其父窗口原点的位移。

void glutReshapeWindow(int width,int height);改变当前窗口的大小。

width,height是当前窗口新的宽度和高度值,当然只能是正值。

void glutFullscreen(void);让当前窗口全屏显示。

当前窗口是顶层窗口时才有效。

void glutPopWindow(void);void glutPushWindow(void);对顶层窗口和子窗口均有效。

改变当前窗口在栈中相对于其它窗口的次序。

void glutShowWindow(void);void glutHideWindow(void);voidglutIconifyWindow(void);这三个函数作用是改变当前窗口的显示状态。

glutShowWindow让当前窗口可视(这时它还是可能被其它窗口挡住)。

glutHideWindow让当前窗口成为不可视状态。

glutIconifyWindow让当前窗口成为一个图标,也即是最小化。

void glutSetWindowTitle(char* name);void glutSetIconTitle(char* name);设置当前窗口(必须是顶层窗口)的标题和图标化时的标题。

void glutSetCursor(int cursor);设置当前窗口的光标样式。

cursor可选值有许多:如GLUT_CURSOR_RIGHT_ARROW指向右边的光标,GLUT_CURSOR_LEFT_ARROW指向左边的光标,GLUT_CURSOR_INFO成为手状。

GLUT_CURSOR_DESTROY呈叉状,GLUT_CURSOR_HELP呈现问号的形状。

等等。

四、窗口的覆盖管理void glutEstablishOverlay(void);对当前窗口创建覆盖图层。

该覆盖图的模式由初始化显示模式函数glutDisplayMode()决定。

glutLayerGet(GLUT_OVERLAY_POSSIBLE); // 可用以设置对于当前窗口,是否允许产生由初始化显示模式函数规定其模式的覆盖图层。

void glutUserLayer(GLenum layer);枚举量layer可选值为:GLUT_NORMAL,GLUT_OVERLAY.分别选取正常位平面或覆盖平面。

void glutRemoveLayer(void);除去覆盖图。

当没有覆盖图层时,调用这条语句也是安全的,这时系统不做任何事。

void glutPostOverlayRedisplay(void);标记该覆盖图层为需要重新显示的状态。

void glutShowOverlay(void);void glutHideOverlay(void);显示当前窗口的覆盖图层;隐藏覆盖图层。

这两条语句即时执行。

注意一下,只有窗口可视时,使用glutShowOverlay才能使其覆盖图层可视。

当窗口被其他窗口遮挡时,其覆盖图层也被遮挡从而不可视。

五、菜单管理int glutCreateMenu(void (*func)(int value))当点击菜单时,调用回调函数func,value为传递给回调函数的数值,它由所选择的菜单条目对应的整数值所决定。

这个函数创建一个新的弹出式菜单,并返回一个唯一的标识次菜单的整型标识符,并将新建的弹出菜单与func函数关联在一起,这样,当选择此菜单中的一个菜单条目时,调用回调函数func.void glutSetMenu(int menu);int glutGetMenu(void);设置当前菜单;获取当前菜单的标识符void glutDestroyMenu(int menu);删除指定的菜单void glutAddMenuEntry(char* name, int value);添加一个菜单条目void glutAddSubMenu(char* name, int menu);在当前菜单的底部增加一个子菜单的触发条目void glutChangeToMenuEntry(int entry, char* name, int value);更改当前菜单中指定菜单项void glutChangeToSubMenu(int entry, char* name, int menu);将指定的当前菜单中菜单项变为子菜单触发条目void glutRemoveMenuItem(int entry);删除指定的菜单项void glutAttachMenu(int button);void glutDetachMenu(int button);把当前窗口的一个鼠标按键与当前菜单关联起来;解除鼠标按键与弹出式菜单的关联关系。

六、注册回调void glutDisplayFunc(void (*func)(void) );为当前窗口设置显示回调函数void glutOverlayDisplayFunc(void (*func)(void) );注册当前窗口的重叠层的显示回调函数void glutReshapeFunc(void (*Func)(int width, int height) );指定当窗口的大小改变时调用的函数void glutKeyboardFunc(void (*func) (unsigned char key, int x, int y) );注册当前窗口的键盘回调函数void glutMouseFunc(void (*func) (int button, int state, int x, int y));注册当前窗口的鼠标回调函数func为注册的鼠标回调函数,这个函数完成鼠标事件的处理button为鼠标的按键,为以下定义的常量:GLUT_LEFT_BUTTON 鼠标左键GLUT_MIDDLE_BUTTON 鼠标中键GLUT_RIGHT_BUTTON 鼠标右键state为鼠标按键的动作,为以下定义的常量:GLUT_UP 鼠标释放GLUT_DOWN 鼠标按下x,y为鼠标按下式,光标相对于窗口左上角的位置void glutMotionFunc(void(*func)(int x, int y));void glutPassiveMotionFunc(void (*func)(int x, int y));设置移动回调函数;设置当前鼠标移动函数Func为注册的鼠标移动函数x,y为鼠标按下式,光标相对于窗口左上角的位置当鼠标在窗口中按下并移动时调用glutMotionFunc注册的回调函数当鼠标在窗口中移动时调用glutPassiveMotionFunc注册的回调函数void glutVisibilityFunc(void (*func) (int state) );设置当前窗口的可视回调函数Func为指定的可视回调函数state表示窗口的可视性,为以下常量:GLUT_NOT_VISIBLE 窗口完全不可见GLUT_VISIBLE 窗口可见或部分可见这个函数设置当前窗口的可视回调函数,当窗口的可视性改变时,该窗口的可视回调函数被调用.只要窗口中的任何一个像素是可见的,或者他的任意一个子窗口中任意一个像素是可见的,GLUT则认为窗口是可见的.void glutEntryFunc(void (*func) (int state));设置鼠标的进出窗口的回调函数Func为注册的鼠标进出回调函数state为鼠标的进出状态,为以下常量之一:GLUT_LEFT 鼠标离开窗口GLUT_RIGHT 鼠标进入窗口当窗口取得焦点或失去焦点时调用这个函数,当鼠标进入窗口区域并点击时,state为GLUT_RIGHT,当鼠标离开窗口区域点击其他窗口时,state为GLUT_LEFT.void glutSpecialFunc(void (*func) (int key, int x, int y))设置当前窗口的特定键的回调函数Func为注册的特定键的回调函数key为按下的特定键,为以下定义的常量:key常量描述GLUT_KEY_F1 F1功能键GLUT_KEY_F2 F2功能键GLUT_KEY_F3 F3功能键GLUT_KEY_F4 F4功能键GLUT_KEY_F5 F5功能键GLUT_KEY_F6 F6功能键GLUT_KEY_F7 F7功能键GLUT_KEY_F8 F8功能键GLUT_KEY_F9 F9功能键GLUT_KEY_F10 F10功能键GLUT_KEY_F11 F11功能键GLUT_KEY_F12 F12功能键GLUT_KEY_LEFT 左方向键GLUT_KEY_UP 上方向键GLUT_KEY_RIGHT 右方向键GLUT_KEY_DOWN 下方向键GLUT_KEY_PAGE_UP PageUp键GLUT_KEY_PAGE_DOWN PageDown键GLUT_KEY_HOME Home键GLUT_KEY_END End键GLUT_KEY_INSERT Insert键x,y为当按下键时鼠标的坐标,相对于窗口左上角,以像素为单位注意:ESC,回车和delete键由ASCII码产生.void glutMenuStatusFunc(void (*func) (int status, int x, int y));设置菜单状态回调函数func是注册的菜单状态回调函数status是当前是否使用菜单,为以下定义的常量:GLUT_MENU_IN_USE 菜单正在使用GLUT_MENU_NOT_IN_USE 菜单未被使用x,y是鼠标按下式,光标相对于窗口左上角的位置这个函数时glut程序判定是否正在使用菜单,当弹出菜单时,调用注册的菜单状态回调函数,同时status设置为常量GLUT_MENU_IN_USE, 当菜单使用完毕时,也调用菜单状态回调函数,此时status变量变为GLUT_MENU_NOT_IN_USE.从已弹出的菜单中再弹出的菜单不产生菜单状态回调过程.每个glut程序只有一个菜单状态回调函数.glutSpaceballRotateFuncglutSpaceballButtonFuncglutButtonBoxFuncglutDialsFuncglutTabletMotionFuncglutTabletButtonFuncvoid glutMenuStatusFunc(void (*func) (int status, int x, int y));设置菜单状态回调函数func为注册的菜单状态回调函数status表示当前是否使用菜单,为以下定义的常量:GLUT_MENU_IN_USE 菜单正在使用GLUT_MENU_NOT_IN_USE 菜单未被使用x,y表示鼠标按下式,光标相对于窗口左上角的位置这个函数时glut程序判定是否正在使用菜单,当弹出菜单时,调用注册的菜单状态回调函数,同时status设置为常量GLUT_MENU_IN_USE, 当菜单使用完毕时,也调用菜单状态回调函数,此时status变量变为GLUT_MENU_NOT_IN_USE.从已弹出的菜单中再弹出的菜单不产生菜单状态回调过程.每个glut程序只有一个菜单状态回调函数.void glutIdleFunc(void (*func) (void));设置空闲回调函数func表示当系统空闲时调用的函数,它的形式为void func(void)void glutTimerFunc(unsigned int msecs, void (*Func)(int value), int value);注册一个回调函数,当指定时间值到达后,由GLUT调用注册的函数一次msecs是等待的时间Func是注册的函数value是指定的一个数值,用来传递到回调函数Func中这个函数注册了一个回调函数,当指定的毫秒数到达后,这个函数就调用注册的函数,value 参数用来向这个注册的函数中传递参数。

相关文档
最新文档