posts - 13,  comments - 0,  trackbacks - 0
OpenGL概览

一个图形硬件的软件接口,包括大约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;
}

posted on 2010-12-26 22:26 xiwrong 阅读(1057) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2010年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿

随笔档案

搜索

  •  

最新随笔

最新评论

评论排行榜