opengl编程指南
第一章 opengl简介
1.1 什么是opengl
opengl是图形硬件的一种软件接口。
1>渲染(rendering)是计算机根据模型创建图像的过程。
2>模型(model)是根据几何图元创建的,也成为物体(object)。
3>几何图元包括点、直线、和多边形等,它们是通过顶点(vertex)指定的。
4>像素是显示硬件可以在屏幕上显示的最小可视元素。
5>OpenGL是一个状态机。
6>OpenGL渲染管线 的一些关键阶段
1. 显示列表
任何数据,不论它描述的是几何图元还是像素,都可以保存在显示列表(display list)中,供当前或以后使用。
2. 求值器
所有的几何图元最终都要通过顶点来描述。求值器提供了一种方法,根据控制点计算表示表面的顶点。这种方法是一种多项式映射,它可以根据控制点产生表面法线、纹理坐标、颜色以及空间坐标值。
3. 基于顶点的操作
把顶点变换为图元
4. 图元装配
图元装配的一个主要内容就是裁剪。
5. 像素操作
6. 纹理装配
OpenGL应用程序可以在几何物体上应用纹理图像,使他们看上去更为逼真。
7. 光栅化
光栅化就是把几何数据和像素数据转换为片段的过程。
8. 片段操作
在数据实际存储到帧缓冲区之前,要执行一系列的操作(纹理处理、测试等)。
7>处理输入事件
1. 可以使用下面这些函数注册一些回调函数,当指定的事件发生时,这些函数便会被调用
glutReshapeFunc(void(*func)(int w, int h)) 表示当窗口的大小发生改变时应该采取什么行动;
glutKeyboardFunc(void(*func)(unsigned char key, int x, int y))把键盘上的一个键与一个函数相关联,当键被按下或释放时函数被调用;
glutMouseFunc(void(*func)(int button, int state, int x, int y))把鼠标上的一个按钮与一个函数相关联,当按钮被按下或释放时函数被调用;
glutMotionFunc(void(*func)(int x, int y))注册了一个函数,当按下一个鼠标按钮移动鼠标时,这个函数就会被调用。
8>空闲处理
glutIdleFunc(void(*func)(void));如果向它传递NULL(0),就相当于禁用这个函数。
9>绘制三维物体
圆锥体,立方体、十二面体、二十面体、八面体、球体、茶壶、四面体、圆环面。
10>电影院,每秒24帧 把图片投影到屏幕
11>OpenGL渲染环境是OpenGL在其中存储状态信息的数据结构。
12>模式是特定于应用程序领域的OpenGL功能集的子集。
13>访问OpenGL函数--找到函数的地址。
范例:
此程序使用了鼠标响应函数和类似重绘的函数。
#include<GL/glut.h>static GLfloat spin = 0.5;void init(void)
{glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_FLAT); //设置着色模式,恒定着色或光滑着色
}void display(void)
{glClear(GL_COLOR_BUFFER_BIT);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 += 2.0;if(spin > 360.0)spin -= 360.0;glutPostRedisplay(); //使每次循环先调用该函数所在函数,然后调用display
}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_MIDDLE_BUTTON:if(state == GLUT_DOWN)glutIdleFunc(0);break;default:break;}
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize(250,250);glutInitWindowPosition(100,100);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMouseFunc(mouse);glutMainLoop();return 0;
}
第三章 观察
3.1 观察点和矩阵的使用
#include<GL/glut.h>
void init(void)
{glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_FLAT);
}void display(void)
{glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glLoadIdentity(); //清空矩阵/* 视点变换 */gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);glScalef(1.0,2.0,1.0); //模型变换glutWireCube(1.0);glFlush();
}void reshape(int w, int h)
{glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);glMatrixMode(GL_MODELVIEW);
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(400,400);glutInitWindowPosition(200,200);glutCreateWindow("study");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;
}
3.4 GLdouble eqn[4] = {0.0, 1.0, 0.0, 0.0};
glClipPlane(GL_CLIP_PLANE0, eqn);
glEnable(GL_CLIP_PLANE0); 即可删除y轴下部分附加载剪面
#include<GL/glut.h>
void init(void)
{glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_FLAT);
}void display(void)
{GLdouble eqn[4] = {0.0,1.0,0.0,0.0};GLdouble eqn2[4] = {1.0,0.0,0.0,0.0};glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,1.0,1.0);glPushMatrix();glTranslatef(0.0,0.0,-5.0);/* 截掉下半部分(y坐标小于0的部分)*/glClipPlane(GL_CLIP_PLANE0,eqn);glEnable(GL_CLIP_PLANE0);/* 截掉下半部分(y坐标小于0的部分)*/glClipPlane(GL_CLIP_PLANE1,eqn2);glEnable(GL_CLIP_PLANE1);glRotatef(90.0,1.0,0.0,0.0);glutWireSphere(1.0,20,16);glPopMatrix();glFlush();}void reshape(int w, int h)
{glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 1.0, 20.0);glMatrixMode(GL_MODELVIEW);
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(400,400);glutInitWindowPosition(200,200);glutCreateWindow("study");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;
}
opengl编程指南相关推荐
- 《OpenGL编程指南》一第2章 着色器基础
本节书摘来自华章出版社<OpenGL编程指南>一书中的第2章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第2章 着色 ...
- OpenGL编程指南7:视图-
1.前言 计算机图形学的要点就是创建三维物体的二维图像(图像必须是二维的,因为他是在平面的屏幕上显示的).但是,当我们决定怎样在屏幕上绘图时,必须使用三维坐标的方式考虑. 为了把一个物体的三维坐标变成 ...
- OpenGL编程指南5:学习绘制不同风格的曲线
1.不同风格曲线绘制 #include <vgl.h> //宏定义;当定义的宏不能用一行表达完整时,可以用"\"表示下一行继续 #define drawOneLine( ...
- OpenGL编程指南4:双缓冲实现运行
1.前言 绘制一个旋转的方块,主要为了说明glutSwapBuffers()函数的用法. 同时也为了学习如何使用GLUT控制输入设备,并打开或关闭空闲处理函数. 2.OpenGL编程及程序剖析 /** ...
- OpenGL编程指南3:GLUT:OpenGL使用工具库
1.前言 我们知道的,OpenGL包含了很多的渲染函数,这些函数的设计目的就是独立与任何窗口系统或操作系统.因此,他并没有包含打开窗口或者从键盘或鼠标读取事件的函数.遗憾的是,如果连最基本的打开窗口的 ...
- opengl编程指南第8版源码编译详细说明
1. 到:https://github.com/openglredbook/examples 下载完全版的源码examples-master.zip,大小有131MB左右,不要下载缩略版的,否则\bi ...
- 《OpenGL编程指南(原书第8版)》——计算着色器
原文 http://www.csdn.net/article/2014-11-21/2822754 主题 OpenGL 数学 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊 ...
- 《OpenGL编程指南》一第3章 OpenGL绘制方式
本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第3章 Op ...
- 《OpenGL编程指南》一3.2 OpenGL缓存数据
本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,第3.2节,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 ...
- OpenGL编程指南(第八版)第一个渲染三角形案例代码在win8双显卡电脑VS2015中运行方法总结
弄了好几天才把第一个程序运行出来,用该博客记录一下参考的博客资料及问题: 写得很好的博客参考资料为: http://blog.csdn.net/IceTeaSet/article/details/50 ...
最新文章
- mysql直连1.执行语句_MySQL随笔01_一条SQL语句是如何执行的
- 从客户端(Content=EM STRONG U 这是测试这...)中检测到有潜在危险的Request.Form 值。...
- MySQL 主外键约束与标准SQL不同的地方
- 基于python、虹软实现人脸检测,人脸识别
- 音视频技术开发周刊 | 225
- 监控主机安装需要材料
- 关于childNodes的删除
- H5炫酷特效系列2——canvas特效-炫酷的心
- linux中脚本后台执行的方法
- 如何在 Mac 上重置网络设置?
- Java基础加强重温_06:可变参数、集合工具类Collections类、冒泡排序、Map集合、Map集合遍历、Map案例、LinkedHashMap集合、图书管理系统
- 分享两款雪花特效代码
- Mysql报错 Error querying database. Cause java.sql.SQLSyntaxErrorException
- 第一次开发EOS区块链的经验
- PHP使用Imagick绘制六芒星能力图
- 被一些数字整除的数字的特征
- Android 7.0 ----- Direct Boot模式(AppClock)
- Java媒体框架(JMF)资料
- 用DD-WRT搭建私有计费WiFi热点教程
- 获取根节点的两种方式