2011年(50)
分类: C/C++
2011-11-15 18:57:49
一个图形硬件的软件接口,包括大约250个函数,用来指定用户和操作,以创建交互式三维应用程序。也是一个独立于硬件的高效接口,可以在很多硬件平台上实现。OpenGL实用库(OpenGL Utility Library)提供了许多建模的特性,是OPenGL实现的标准组成部分。
OpenGL是一个状态机,它一直处于你指定的各种状态或模式中,直到你修改这些状态为止。
OpenGL渲染流水线,大多数OpenGL实现都使用相似的操作,包括顶点操作、图元装配、像素操作、纹理装配、光栅化、片元操作
OpenGL实用工具包(GLUT)
简化打开窗口、检测输入等任务,用于创建复杂三维物体(如球体、圆环和茶壶)。
1、窗口管理
glutInit(&argc, argv);//初始化
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);//指定模式
glutInitWindowPosition(100, 100);//指定窗口起始位置
glutInitWindowSize(250, 250);//指定大小
glutCreateWindow("TRIANGLE");//指定标题
2、显示回调函数
glutDisplayFunc(renderScene);//重新绘制场景需要的函数
glutPostRedisplay();//程序修改了窗口的内容
3、运行程序
glutMainLoop();调用注册的显示回调函数
4、处理输入事件
glutReshapeFunc(reshape);//窗口大小发生改变时应采取的措施
glutMouseFunc(mouse);//键盘响应
glutKeyboardFunc(keyb);//鼠标响应
glutMotionFunc(motion);/按下/鼠标并移动鼠标的响应函数
5、管理后台处理
glutIdleFunc(spinDisplay);
6、绘制三维物体
动画
通常以每秒24帧投影到屏幕来实现,运动就是重画加交换。
双缓存技术,伪代码如下:
open_window_in_double_buffer_mode();
for (int i=0; i<1000000; i++){
clear_the_window();
draw_frame(i);
swap_the_buffers();
}
实例:使用双缓存绘制的旋转正方形。(需要正确配置相关dll、lib、.h等文件,否则编译或link时会出错)
如图:
代码如下:
#include "stdio.h"
#include "stdlib.h"
#include "windows.h"
#include "GL/gl.h"
#include "GL/glut.h"
static GLfloat spin = 0.0;//旋转的角度
void init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_FLAT);
}
void renderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);//clear all pixels
glPushMatrix();
glRotatef(spin, 0.0, 0.0, 1.0);
glColor3f(1.0, 1.0, 1.0);
glRectf(-25.0, -25.0, 25.0, 25.0);
glPopMatrix();
glutSwapBuffers();
}
void spinDisplay(void)
{
spin = spin + 2.0;
if (spin > 360)
spin = spin -360;
glutPostRedisplay();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void mouse(int button, int state, int x, int y)
{
switch (button)
{
case GLUT_LEFT_BUTTON://左键启动
if (state == GLUT_DOWN)
glutIdleFunc(spinDisplay);
break;
case GLUT_RIGHT_BUTTON://右键停止
if (state == GLUT_DOWN)
glutIdleFunc(NULL);
break;
default:
break;
}
}
//双缓存模式
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(250, 250);
glutCreateWindow("square");
init();
glutDisplayFunc(renderScene);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}