OpenGL学习
Posted biyangqiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL学习相关的知识,希望对你有一定的参考价值。
1. 常识
static GLint vertices[] = { 25, 25, 100, 325, 175, 25, 175, 325, 250, 25, 325, 325 };//这些坐标,画的时候都是相对于屏幕右下角 |
PS:如果修改了窗口的内容,就需要调用glutPostRedisplay(); |
PS:窗口在创建的时候就发生了窗口大小的改变,所以要调用glutReshapeFunc, 可以看到每次窗口变化都调用了其中的代码 |
2. OpenGL简介
PS:接口包含函数700多个 PS:OpenGL也没有提供包含三维物体的高级函数,只能通过使用为数不多基本图元(点、直线、多边形)来创建 PS:OpenGL的工具库(GLU)提供了许多建模的功能,例如二次曲面以及Nurbs曲线和曲面 |
1.1 OpenGL对场景中图形渲染的步骤
1.创建几何图元,创建图形,建立数学描述 2.在三维空间中排列物体,并选择观察符合场景的有利视角 3.计算所有物体的颜色(可以由 程序决定、光照和物理纹理贴图 , 或者是三者的结合) 4.把物体的数学描述和物体的相关颜色信息转换成屏幕上的像素 |
PS:OpenGL也是C/s的模式 |
2.1 几个简单的概念
PS:渲染,是计算机根据模型创建图形的过程 模型,是根据几何图元创建的,也叫物体 几何图元,包括点、直线和多边形,他们是通过顶点指定的 |
像素-》位平面-》帧缓冲区 PS:最终完成的的图像是由屏幕上绘制的像素组成。像素:是显示硬件可以在屏幕上显示的最小元素;在内存中,和像素有关的信息(例如像素的颜色)组织成位平面 PS:位平面是一个内存区域,保存着屏幕上每个像素的1个位的信息,(比如它可以指定特定像素的颜色的红色成分信息)。位平面又可以组织成侦缓冲区的形式。 PS:帧缓冲区,保存着所有像素的颜色和强度所需要的全部信息 |
1.3 OpenGL是一个状态机
PS:他可以用状态控制
|
1.4显示列表
PS:他是一种模式, 不管图元还是像素都可以放在显示列表中,供以后操作。
也可以立即对数据处理,叫做立即模式。
1.5 求值器 :提供了一个方法,根据控制点计算表面的顶点。
2.2 一些API的简单介绍
glClearColor(0.0, 0.0, 0.0, 0.0);//把屏幕清楚成什么颜色,R,G,B,模糊, 设置成1就是 0.0是全黑色, 1.0是向白色过度 |
2.3
3. 状态管理和绘制几何物体
3.1 绘图工具箱
PS:OpenGL允许程序员任意设置坐标系统、观察位置和方向。 所以弄成清楚缓冲区,不能指定清除某些地方。
|
PS: glClearColor(0.0, 1.0, 0.0, 0.0);//把背景改成绿色,清清除 颜色缓冲区 glClaer(GL_COLOR_BUFFER_BIT);清除颜色缓冲区,还有 深度缓冲区、累积缓冲区、模板缓冲区 |
颜色选择 1.一般会先考虑颜色方案,再考虑绘制物体的颜色 |
glFlush()强制命令去执行; |
2.1.4 坐标系统工具箱 glViewport();用于调整绘图的函数矩形 PS:当窗口移动或者发生窗口大小改变的时候。
|
3.2
3.3
3.4 显示点、直线和多边形
PS:在GLBegin()和GLend()之间,只能放点的信息,不能放其他信息
点和直线的细节PS:默认的情况下,点是一个像素 PS: glPointSize(size)设置点的大小 glLineWidth(size)设置直线的宽度 PS:………………………..默认是1.0,如果启用锯齿的功能,可以为浮点数 PS:glLineStipple(1,0xddd);点划线 |
多边形的细节PS:正常情况下,多边形正反面 会被渲染成相同; glPolygonMode(x,x);指定绘制模式 PS:可以根据glFrontFace()指定正反面; |
点画多边形PS:glPloygonStipple()
|
多边形的边界有时候为了绘制非凸的多边形,得使用glPloygonMode(),但是同时需要告诉谁是终点glEdgeFlag(true); |
3.5 法线向量
物体的法线向量定义了他在空间中的方向;定义了他相对于光源的方向 |
PS: 如果模型只涉及旋转和移动、发现能够保持规范化;但是如果进行了不规则变化(缩放,剪切),那就需要手动进行规范化glNomalize() |
2.6顶点数据--为了解决大量的调用函数
PS:使用顶点数组 渲染 图形的过程
gLEnableClientState(GL_Vertex_Array);后面的枚举值不确定,还有很多的其他的种类。 ------------------------------------------
3.1访问单个数组元素 glArrayElement(3); 3.2 创建一个单独数组元素列表 glDrawElements(GL_POLYGON, 4, GL_UNSIGNED_INT, indices); 3.3线性的处理数组元素 glDrawArrays(GL_TRIANGLES, 0, 6); 混合顶点数组可以吧不同类型的数据(颜色、法线、坐标)放在数组中 |
2.7 缓冲区对象 –这是类似于OpenGL的一个东西
2.8 创建多边形模型的一些提示
PS:如果启用了光照,就必须指定法线的向量 |
|
3 视图
PS: 视图变换:确定 场景的位置;
模型变换:场景中模型的位置
投影变换:确定视景体的形状。
视口:决定最终的位置
PS:计算机图形的要点就是 创建三维物体的二维图像 一个物体的三维坐标变成屏幕上的像素经过: 1.变换(矩阵相乘) 移动、旋转、缩放、平移、反射、投影等等。 2.剪裁掉屏幕外面的物体 3.经过了变换坐标和屏幕像素建立对应联系,这个过程叫做视口(viewport) |
PS:视口变换:把三维坐标转换为屏幕坐标 |
PS:顶点的变换步骤: 物体坐标-》模型矩阵------视觉坐标-----》投影矩阵-----剪裁坐标------》透视出发----规范化坐标系----》视口变换---窗口坐标---》 PS:投影变换分为2种:1.透视投影(类似于生活中,火车轨道在远处)glFrustum 2.正投影(直接投影);glOrtho使用的是正投影 变换和模型变换是相对而言的,两者可相互转换;从一个方向移动照相机和从相反方向移动物体是一样的。 |
PS:注意事项:
3.1 执行NMLv变换,变换是逆序执行的,先v*L,L*M……. 3.2 两种坐标系统,全局和局部
|
PS:一个按照逆时针方向旋转的物体模型变换==按顺时针方向旋转的照相机的视图变换 模型变换:主要有移动Translate,旋转rotate,伸缩scale
PS:通常先模型变换再视图变换;视图变换也是有 移动和选择构成的; Gllookat封装就是 Translate和Rotate 默认相机在原点,与Z轴相反,y为正方向的朝上方向 PS:经过模型矩阵和视图矩阵 变换之后,会自动剪裁到相应的面,其他相应面也能剪裁(需要自己指定) |
GLPushMatrix 、GLPopMatrix 比方: PS:太阳系的那个例子,他执行了相应的变换,重新绘图已经弹出,正好重新绘制 |
4 颜色
4.1 计算机颜色
PS: 硬件装置使屏幕上的每个像素发射不同的红、绿、蓝;每一个像素的颜色信息可以按照RGBA模式或颜色索引模式存取; 在颜色索引模式下,每个像素存储一个表示颜色序号的数值;用于存储所有像素颜色的内存成为颜色缓冲区; |
PS:在没用光照的情况下,颜色是不可能变的; 用了光照,颜色也有可能变了; 单调着色,和平滑着色 会对像素产生不同的影响; |
|
4.2 颜色的选择
PS:默认情况下,建议使用RGBA,颜色索引是用在一些特殊的技巧
|
PS:多窗口,可以为每一个窗口赋予不同的颜色和值 |
RGB模式 glColor() 颜色索引模式 glIndex(); glClearIndex(); 清除当前颜色 |
|
4.3 指定着色模式
glShadeModel() //Falt还是SMOOTH
5 光照---1.隐藏表面消除2.如何控制场景中的光照
PS:OpenGL把光照模型分为: 环境光、散射光、镜面光、发射光
PS: OpenGL 的光照成分是LR,LG,LB;材料是MR,RG,MB 进入人眼的光就是 两个向量单个相乘 两个入射光叠加在一起,光就是进入眼睛就是向量相加 |
PS:为了正确计算灯光必须保证 表面发现的规范化 (单位矩阵),使用GL_RESCALE_NORMAL函数 |
PS:一个光有很多参数 GL_AMBIENT,GL_DIFFUSE,GL_SPECULAR 是与颜色相关的,要想做到逼真,必须把后两者定义成一模一样 |
灯光的位置和衰减PS:光分为平行光和位置光源,位置光源会随着位置变动而衰减 |
控制光源的位置和方向:通过修改模型矩阵或者来修改
|
选择光照模型4种 全局光、局部远处、双面、镜面辅助· |
定义材料的属性
|
第6章 本章主要讲6种技巧---主要使效果更好
PS:混合、抗锯齿、雾、点参数、多边形偏移 |
第七章 显示列表
PS:显示列表就是一组存储在一起的OpenGL函数,方便以后执行;之前学习的都是立即模式
|
第8张 位图 和 图像
第九章 纹理贴图
第10章 侦缓冲区
PS:存储所有像素的存储空间称为侦缓冲区, 每个像素存了1位信息的缓冲区又称为位平面 PS:各种缓冲区的操作 |
|
|
11 分格化 和 二次方程表面
PS:分格化就是对凹多边形分割成凸多边形,就是一组函数 |
PS:二次方程表面慢慢被废弃掉了
PS: OpenGL只支持一些函数简单的,复杂的无法创建;GLU提供的了一些方法 |
|
12 重点学习 求值器和NURBS
PS:书中说了会返回物体的顶点数据;
PS:非常实用的曲线和曲面都是通过控制点(几个参数)来模拟 PS:求值器提供了一种方式,只用少数的控制顶点来指定曲线或表面(包括各种曲面)
|
12.3 GLU 的NURBS例子 |
13 选择 和 反馈
PS:选择是OpenGL的一种操作模式;反馈是另一种模式 |
以上是关于OpenGL学习的主要内容,如果未能解决你的问题,请参考以下文章
我的OpenGL学习进阶之旅持续更新关于学习OpenGL的一些资料
我的OpenGL学习进阶之旅学习OpenGL ES 3.0 的实战 Awsome Demo (上)