Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92876
  • 博文数量: 50
  • 博客积分: 1086
  • 博客等级: 少尉
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-25 16:16
文章分类
文章存档

2011年(50)

我的朋友

分类: C/C++

2011-11-15 18:57:49

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;
}

阅读(2423) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~