第一课 opengl简介
1. 什么是opengl:
opengl是图形硬件的一种软件接口。
2. opengl对场景中的图像进行渲染时所执行的主要图形操作
1)根据几何图元创建形状,从而建立物体的数学描述。
2)在三维空间中排列物体,并选择观察复合场景的有利视角。
3)计算所有物体的颜色。(ps:可以使用着色器或者opengl与编程算法执行, opengl预编程算法又被称为固定功能的管线)
4)把物体的数学描述以及与物体相关的颜色信息转换为屏幕上的像素。这个过程称为光栅化rasterization.
3. 几个术语:
rendering渲染: 计算机根据模型创建图像的过程。
model模型:根据几个图元创建的,也被称为物体object。
几何图元:包括点、直线、多边形,他们通顶点vertex指定。
bitplane位平面:一块内存区域,保存了屏幕上每个像素的1个位的信息。
framebuffer:由bitplane组织成的,保存图形硬件为控制屏幕上所有像素的颜色和强度所需要的全部信息。
4. opengl的语法:
由gl开头,常量大写GL, 最后跟v的表示函数所接受的参数是一个指向值向量的指针。
5. OPENGL是一个状态机:
许多模式的状态变量用 glEnable()和glDisable()函数进行启动和禁用。
每个状态变量都有默认值,查询办法:glGetBooleanv(),glGetDoublev(), glGetIntegerv(), geGetfloatv(), glGetPointerv(), glIsEnable();
6. openGL渲染管线:
像素数据 -----》显示列表 《--------顶点数据
|| || ||
像素操作《-------------------------》求值器
|| ||
||---------》光栅化《------基于顶点的操作与基本装配
|| ^ ||
纹理装配== | 片段操作
||
帧缓冲区
1)显示列表 display list :任何数据无论是几何图元或者像素,都可以保存在现实列表中供以后使用。
2)求值器: 所有几何图元通过vertex来描述, 参数化曲线和face,最终通过控制点和基函数basic function多项式来描述。求值器提供通过控制点计算表面定点的方法。
3)基于vertex的操作:就是把顶点变换成图元,通过4×4浮点矩阵进行变换。如果使用纹理,还要进行纹理坐标变换。 如果有光照,要进行光照计算,产生最终颜色值。
4)图元装配:主要内容是裁剪。还有透视除法、视口和深度操作。
5)像素操作:首先解包为适当数据,接着被缩放偏移处理,然后写入纹理内存或者发送到光栅化阶段。
6)纹理装配:在几何物体上应用纹理图像。
7)光栅化:就是把几何数据和像素数据转换为fragment的过程。每个fragment方块对应于帧缓存区中的一个像素。
8)片段操作:在数据实际存储到帧缓冲区之前,要执行的一系列操作。
a. 纹理处理, 在纹理内存中为每个fragment生成一个texel纹理单元。接下来组合主颜色和辅助颜色,可能还用到一次雾计算。
b. 生成最终颜色和深度以后,进行裁剪测试,alpha测试,模板测试,深度缓冲区测试;
c. 混合,抖动, 逻辑操作,以及根据一个位掩码的屏蔽操作。
d. 绘制到适当的缓冲区,最终成为一个pixel。
7. opengl相关函数库:
工具函数库GLU,窗口系统扩展glX\wgl\agl,cgl,实用工具库GLUT
包含文件#include <GL/gl.h>
#include <GL/glu.h>
在包含了glut.h或者freeglut.h以后就不用包含上面两者了。
8. glut:
1)窗口管理:
void glutInit(int argc, char**argv);
void gultInitDisplayMode(unsigned int mode);
void glutInitContextVersion(int maj, int min);
void glutInitWindowSize(int width, int height);
void glutInitWindowPostion(int x, int y);
void glutCreateWindow(char * name);
2)处理窗口和事件
void glutDisplayFunc(void (*func)(void));
void glutReshapeFunc(void (*func)(int width, int height));
void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y));
void glutMouseFunc(void (*func)(int button,int state, int x, int y));
void glutMotionFunc(void (*func)(int x, int y));
void glutPostRedisplay(void);
3)加载颜色表:void glutSetColor(...);
4)初始化和绘制三维物体:略
5)管理背景过程:void glutIdleFunc();
6)运行程序: void glutMainLoop();
9. 一个双缓冲的动画程序:
- #include <glut.h>
- #include <Windows.h>
- #include <stdio.h>
- static GLfloat spin = 0.0;
- 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 = spin + 2.0;
- if(spin > 360.0){
- spin = spin - 360.0;
- }
- glutPostRedisplay();
- }
- void reshape(int w, int h)
- {
- glViewport(, , (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(NULL);
- break;
- default:
- break;
- }
- }
- int main(int argc, char ** argv){
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
- glutInitWindowSize(, );
- glutInitWindowPosition(, );
- glutCreateWindow(argv[]);
- init();
- glutDisplayFunc(display);
- glutReshapeFunc(reshape);
- glutMouseFunc(mouse);
- glutMainLoop();
- return ;
- }
第一课 opengl简介的更多相关文章
- 第一课~Django~简介
Django一个可以是Web开发工作者开发工作愉快并且高效的Web 框架 . 使用Django , 使你能够以最小的代建构建和维护高质量的Web应用 . 从好的方面来看 , Web开发激动人心并且富有 ...
- NeHe OpenGL教程 第一课:OpenGL窗口
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Android OpenGL教程-第一课【转】
第一课 快速的开始一个Android OpenGL项目 首先,读懂我们的教程,需要有android的初步基础,我们这里只是通过android提供的SDK,来进行OpenGL的学习,所以你必须先学习如何 ...
- 第一课、OpenGL绘制直线等等
第一课.OpenGL绘制直线等等 分类: [开发技术]OpenGL 2012-01-18 14:59 5217人阅读 评论(0) 收藏 举报 buffer图形c // // main.c // o ...
- Nehe OpenGL教程第一课-创建一个OpenGL窗口(Win32)
原文英文地址为:Creating an OpenGL Window (Win32),翻译的chm中文格式文档下载地址为:OpenGL教程电子书(chm格式)中文版,源代码在官网上也可以下载到,每 ...
- 【C语言探索之旅】 第三部分第一课:SDL开发游戏之安装SDL
内容简介 1.课程大纲 2.第三部分第一课: SDL开发游戏之安装SDL 3.第三部分第二课预告: SDL开发游戏之创建窗口和画布 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会 ...
- 【Linux探索之旅】第二部分第一课:终端Terminal,好戏上场
内容简介 1.第二部分第一课:终端Terminal,好戏上场 2.第二部分第二课预告:命令行,世界尽在掌握 终端Terminal,好戏上场 随着第一部分的结束,我们进入了第二部分(小编你这好像是废话. ...
- 【Web探索之旅】第三部分第一课:服务器
内容简介 1.第三部分第一课:服务器 2.第三部分第二课预告:IP地址和域名 第三部分第一课:服务器 大家好,欢迎来到[Web探索之旅]的第三部分.这一部分有不少原理,还是很重要的. 这一部分我们会着 ...
- 【Web探索之旅】第二部分第一课:客户端语言
内容简介 1.第二部分第一课:客户端语言 2.第二部分第二课预告:服务器语言 第二部分:Web编程语言和工具 大家好.上一个部分我们学习了Web的一些基本概念: 什么是Web? Internet和We ...
随机推荐
- Ruby Class
类定义: class 类名 类定义 end ※类名大写字母开始!!! 构造方法(initialize) 类名调用new方法的时候,触发的一个方法. def initialize(my_name = & ...
- Debian安装记录
Fedora着实让我伤心透了.前天和昨天搞了整整两天Fedora 20的安装,午睡也没有,晚上就睡了四个小时不到,几乎尝试了所有Fedora 20的桌面版本,全部出问题了!就因为我的笔记本显卡是ATI ...
- [转]Neutron演进
在OpenStack世界中,网络组件最初叫nova-network,它混迹于计算节点nova的代码库中.nova-network可以单独部 署在一台机器上,为了高性能HA也可以和nova-comput ...
- json 解析
纠结了两天的json数组反序列化,终于在同事的帮助下,找到方法了,特作笔记如下: using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Sy ...
- android学习笔记18——dpi、dp、sp、xp......
参考:http://www.cnblogs.com/greatverve/archive/2011/12/28/android-dip-dp-sp-pt-px.html http://www.360 ...
- 【MySQL】索引长度的一些限制
有同学问到InnoDB的索引长度问题,简单说几个tips. MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制. myisam表,单列索引,最大长度不能超过 1000 ...
- 【转 】实战手记:让百万级数据瞬间导入SQL Server
想必每个DBA都喜欢挑战数据导入时间,用时越短工作效率越高,也充分的能够证明自己的实力.实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本文将向大家推荐一个挑战4秒极限让百万级数据瞬间 ...
- Apache日志不记录图片文件设置方法和来源日志的配置
Apache日志不记录图片文件设置方法 <FilesMatch "\.(ico|gif|jpg|swf)">SetEnv IMAG 1</FilesMatch&g ...
- VisualStudio 调试不提示调试错误
尝试办法: 1.工具->选项->调试->启用异常助手;2.调试->异常; 解决办法: 把2.调试->异常; 下地全部钩上异常就弹出来了
- 黄聪:360浏览器、Chrome调试(debugger)JS总是进入paused in debugger状态
在通过Chrome浏览器进行web前端开发时,我们会经常用到Chrome自带的debugger工具,但是经常按完快捷键(F12)后,页面会进入paused in debugger状态,需要点击右上角的 ...