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:使用顶点数组 渲染 图形的过程

  1. 激活数组(最多8个)

gLEnableClientState(GL_Vertex_Array);后面的枚举值不确定,还有很多的其他的种类。

------------------------------------------

 

  1. 把数据放入数组
  2. glVertexPointer(size,type,stride,*poninter);
  3. 用这些数据绘制几何图形,三种方式能完成该功能
  4. ------------------------------------------------------------------

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:注意事项:

  1. 在调用变换函数时,需要确定自己要修改的是 模型视图矩阵还是 投影矩阵;通常在变换之前需要glLoadIndentity();修改矩阵为4*4的单位矩阵
  2. 可以使用    显示列表来存储经常使用的矩阵
  3. 执行模型和视图变换之前必须GL_MODELVIEW进行转换(在执行的时候顺序是很重要的)

3.1    执行NMLv变换,变换是逆序执行的,先v*L,L*M…….

3.2    两种坐标系统,全局和局部

 

PS:一个按照逆时针方向旋转的物体模型变换==按顺时针方向旋转的照相机的视图变换

模型变换:主要有移动Translate,旋转rotate,伸缩scale

 

PS:通常先模型变换再视图变换;视图变换也是有 移动和选择构成的;

Gllookat封装就是  Translate和Rotate

默认相机在原点,与Z轴相反,y为正方向的朝上方向

PS:经过模型矩阵和视图矩阵 变换之后,会自动剪裁到相应的面,其他相应面也能剪裁(需要自己指定)

GLPushMatrix 、GLPopMatrix

比方:
glLoadIdentity();
glTranslatef(1,0,0);//向右移动(1,0,0)
glPushMatrix();//保存当前位置
glTranslatef(0,1,0);//如今是(1,1,0)了
glPopMatrix();//这样,如今又回到(1,0,0)了

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:光分为平行光和位置光源,位置光源会随着位置变动而衰减

控制光源的位置和方向:通过修改模型矩阵或者来修改

  1. 光源保持静止
  2. 光动物体不动
  3. 物体动光也动

选择光照模型

4种

全局光、局部远处、双面、镜面辅助·

定义材料的属性

 

第6章 本章主要讲6种技巧---主要使效果更好

PS:混合、抗锯齿、雾、点参数、多边形偏移

第七章 显示列表

PS:显示列表就是一组存储在一起的OpenGL函数,方便以后执行;之前学习的都是立即模式

glNewList(listName, GL_COMPILE);

    glColor3f(1.0, 0.0, 0.0);  /*  current color red  */

    glBegin(GL_TRIANGLES);

    glVertex2f(0.0, 0.0);

    glVertex2f(1.0, 0.0);

    glVertex2f(0.0, 1.0);

    glEnd();

glEndList();

 

第8张 位图 和 图像

第九章  纹理贴图

第10章 侦缓冲区

PS:存储所有像素的存储空间称为侦缓冲区,  每个像素存了1位信息的缓冲区又称为位平面

PS:各种缓冲区的操作                                                                                                                                 

 

 

11 分格化 和 二次方程表面

PS:分格化就是对凹多边形分割成凸多边形,就是一组函数

PS:二次方程表面慢慢被废弃掉了

 

 

PS: OpenGL只支持一些函数简单的,复杂的无法创建;GLU提供的了一些方法

 

 

 

12 重点学习 求值器和NURBS

PS:书中说了会返回物体的顶点数据;

 

PS:非常实用的曲线和曲面都是通过控制点(几个参数)来模拟

PS:求值器提供了一种方式,只用少数的控制顶点来指定曲线或表面(包括各种曲面)

  1.  一维求值器

 

 

12.3 GLU 的NURBS例子

13  选择 和 反馈

PS:选择是OpenGL的一种操作模式;反馈是另一种模式

以上是关于OpenGL学习的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅OpenGL的坐标系的学习笔记

OpenGL学习

我的OpenGL学习进阶之旅持续更新关于学习OpenGL的一些资料

我的OpenGL学习进阶之旅学习OpenGL ES 3.0 的实战 Awsome Demo (上)

我的OpenGL学习进阶之旅学习OpenGL ES 3.0 的实战 Awsome Demo (上)

OpenGL学习笔记: mac下OpenGL环境搭建