您的位置:首页 > 运维架构

OpenGL简介

2010-11-29 18:25 176 查看
OpenGL是OpenGL是一个操纵硬件的软件接口
包含大约250个函数(GLU中50个)
没有执行窗口任务的函数
没有获取用户输入的函数
没有描述高级三维模型例如汽车/人等的高级函数
只有描述几何图元的函数(点/直线/多边形)
OpenGL实用库(GLU)提供了高级特性(二次曲面,NURBS曲线,曲线)

渲染,指计算机根据模型创建图像。模型,是有几何图元(点/直线/多边形)构成的。几何图元,由顶点指定。vertex最终渲染的图像,由屏幕像素组成。像素是显示硬件能够放置到屏幕上的最小的可视元素。有关像素的信息,如颜色,在系统内存中被组织为位面bitplane。bitplane是一块内存区域,存储屏幕上一个像素所需的信息。许多位面一起,构成了帧缓冲
OpenGL函数命名规则gl + 函数功能描述 + 数字,表示接收参数个数 + f/d等字母,表示接收参数类型,其中v表示指针/数组。
OpenGL是一个状态机。当设置了状态之后,直到下一次修改设置之前,状态都有效。

glEnable()和glDisable()启用和禁用某状态。

glGetBooleanv();glGetDoublev();glGetFloatv();glGetIntegerv();glGetPointerv();glIsEnable(),六个函数都返回状态值,只是类型不同。也可以使用更具体的glGetLight*()等。

另外可以使用glPushAttrib()和alPopAttrib()将一组状态变量的值保存到属性堆栈中,暂时修改它们。将来使用glPopAttrib()和glPopClientAttrib()恢复。就暂时修改状态而言,使用该方法可能比使用查询函数效率更高。OpenGL渲染流水线

OpenGL渲染流水线使用双缓存的一个例子#include <Windows.h>

#include <gl/glut.h>

// 旋转角度
static GLfloat spin = 0.0;

void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
}

void createRect(void)
{
glClear(GL_COLOR_BUFFER_BIT);

// 这里使用glPushMatrix和glPopMatrix对
// 上例使用glBegin和glEnd对
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 spinRect(void)
{
spin = spin +2.0;
if (spin>360.0)
{
spin = spin-360.0;
}
// 显示?
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)
// 在空闲时spinRect
glutIdleFunc(spinRect);
break;
case GLUT_MIDDLE_BUTTON:
if (state == GLUT_DOWN)
// 停止空闲时的操作
glutIdleFunc(NULL);
break;
default:
break;
}
}

int main(int argc, char** argv)
{
// GLUT初始化窗口的5个必须的步骤
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);
glutInitWindowPosition(250,250);
glutInitWindowSize(400,400);
glutCreateWindow("Hello");

// 一些初始化操作
init();

// 添加回调*****重要
glutDisplayFunc(createRect);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);

// 真正开始绘制
glutMainLoop();

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: