基本概念

基本功能:几何图形、变换、着色、光照、贴图
高级功能:曲面图元、光栅操作、景深、shader编程
 
状态机
先设置状态参数:多边形、顶点列表、填充颜色、纹理、混合模式、坐标系
再调用绘图指令
如果没有设置新参数,会一直用当前的状态来绘图,所以是有状态的
 
OpenGL可以分为客户端和服务端,客户端可以是cpu或主机,服务端是gpu或另一台主机
客户端发送绘图指令,服务端负责绘制渲染,尽量在客户端完成工作,只发送必要数据到服务端,减少传输压力
 
开启/关闭绘图特性
 
GL_APICALL void GL_APIENTRY glEnable(GLenum cap); // 开启一个状态
GL_APICALL void GL_APIENTRY glDisable(GLenum cap); // 关闭一个状态
 
类型GLenum表示OpenGL状态量
全部状态列表定义在gl2.h中
可以开启若干状态来实现特定的绘图效果,之后禁止掉这些状态
比如,剪裁渲染区域需要设置GL_SCISSOR_TEST状态
 
OpenGL使用右手三维坐标系:屏幕左下角是原点,从原点开始:向右是x正向,向上是y正向,向屏幕对面是z正向
利用坐标描述图形的形状,把形状交给OpenGL来绘制
OpenGL负责把三维空间中的对象通过投影(投影可以粗略想象成光照一个物体,在墙上显示出来的影子)、光栅化(?)转换为二维图像,然后显示在屏幕上
在二维引擎中,z坐标只用来控制游戏元素的前后顺序
 
cocos2dx绘制精灵
1.根据精灵的位置创建矩形
2.在OpenGL中设置矩形的顶点以及纹理
3.绘制图形,显示在屏幕上
 
OpenGL初始的坐标系是世界坐标系
绘图坐标系在初始化时和世界坐标系相同
但是可以通过变换函数(平移、旋转、缩放)来改变绘图坐标系
图形绘制在绘图坐标系中,因此平移图形不用改变每个顶点,只用改变绘图坐标系即可
绘制不同位置的不同物体也可以通过改变绘图坐标系来实现
 
渲染流水线过程:
显示列表、求值器、顶点装配、像素操作、纹理装配、光栅化、片段操作
OpenGL ES 1.0 固定渲染管线 每一个步骤的操作是固定的,只能使用OpenGL提供的渲染模型
OpenGL ES 2.0 可编程着色器shader 可以作为渲染管线中一些部分的替代品 自定义渲染效果
自由控制顶点和片段处理采用的算法
shader包含顶点着色器(顶点的几何变换和光照计算)和片段着色器(处理光栅化得到的像素及纹理)
 
draw可以分为3个部分:数据部分、初始化纹理、绘图,从而绘制一个带纹理的矩形
也可以通过三角形带来绘制 triangle stripe 参考
 
数据部分:设置三角形带(矩形)的顶点坐标、纹理坐标、顶点颜色
初始化纹理:从文件中加载纹理到内存,用纹理的属性设置上述纹理坐标中的4个顶点
绘制图片:绑定纹理、设置顶点数组、绘图
 
绑定纹理:把一个曾经载入的纹理当作当前纹理,以后绘制出的多边形都使用此纹理
设置顶点数组:把上述顶点坐标、纹理坐标、顶点颜色设置进OpenGL中
绘图:glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 参数:绘图模式、起始顶点下标、顶点数量
 

坐标变换

 
OpenGL对顶点的处理:接受顶点数据、投影、得到变换后的顶点数据
顶点变换过程:
1.设置绘图坐标系
2.传入顶点数据(相对于世界坐标系)
3.OpenGL通过计算把顶点映射到世界坐标系
4.把世界坐标系中的点通过投影变换为可视平面上的点
 
用向量表示坐标,矩阵表示变换形式,变换后的顶点坐标可以用向量与矩阵的乘法表示
 
为了利用矩阵乘法对点进行平移,需要用齐次坐标来表示顶点
齐次坐标系中每一个点的维度比顶点维度多1,多的这个维度其值为1
比如三维顶点(x,y,z)在齐次坐标系中的向量是(x,y,z,1)
 
常见的变换:平移、旋转、缩放
平移矩阵
其中(tx,ty,tz)为平移的方向向量
用平移矩阵坐乘顶点列向量,即得平移后的顶点列向量
比如:把点(1.2,5,10)平移(6,5,4),则
假如要对点p依次进行缩放、平移、缩放、旋转操作
先构造其变换矩阵:S1,T,S2,R
则变换后的p’=S1*T*S2*R*p
 
OpenGL维护一个绘图矩阵,表示当前的绘图坐标系
初始化时,绘图矩阵是单位矩阵M=I
变换后,绘图矩阵变为M=S1*T*S2*R,表示一个绘图坐标系
所以,p是绘图坐标系上的点,绘图矩阵是M,则p在世界坐标系的坐标是p’=M*p
所以坐标变换实际上是绘图矩阵的变换
 
对一个图形变换,就是变换绘图矩阵,OpenGL ES 2.0 用Kazmath如下
kmGLScalef(0.8f, 0.8f, 0.8f); // 乘上缩放矩阵
kmGLTranslatef(1.0f, 2.0f, 3.0f); // 乘上平移矩阵
kmGLRotatef(2.5f, 2.5f, 2.5f); // 乘上旋转矩阵
DrawObject(); // 绘制任意图形

OpenGL学习——基本概念和坐标变换的更多相关文章

  1. OpenGL学习笔记3——缓冲区对象

    在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...

  2. OpenGL学习笔记:拾取与选择

    转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...

  3. OpenGL学习之路(一)

    1 引子 虽然是计算机科班出身,但从小对几何方面的东西就不太感冒,空间想象能力也较差,所以从本科到研究生,基本没接触过<计算机图形学>.为什么说基本没学过呢?因为好奇(尤其是惊叹于三维游戏 ...

  4. OpenGL学习之路(三)

    1 引子 这些天公司一次次的软件发布节点忙的博主不可开交,另外还有其它的一些事也占用了很多时间.现在坐在电脑前,在很安静的环境下,与大家分享自己的OpenGL学习笔记和理解心得,感到格外舒服.这让我回 ...

  5. OpenGL学习之路(五)

    1 引子 不知不觉我们已经进入到读书笔记(五)了,我们先对前四次读书笔记做一个总结.前四次读书笔记主要是学习了如何使用OpenGL来绘制几何图形(包括二维几何体和三维几何体),并学习了平移.旋转.缩放 ...

  6. OpenGL学习之windows下安装opengl的glut库

    OpenGL学习之windows下安装opengl的glut库 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装.  Windows环境下的GLUT下载地址:(大小约为15 ...

  7. OpenGL学习-------绘制简单的几何图形

    本次课程所要讲的是绘制简单的几何图形,在实际绘制之前,让我们先熟悉一些概念. 一.点.直线和多边形我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念在计算机中会有所不同.数学上的 ...

  8. OpenGL学习进程(8)第六课:点、边和图形(三)绘制图形

    本节是OpenGL学习的第六个课时,下面介绍OpenGL图形的相关知识:     (1)多边形的概念: 多边形是由多条线段首尾相连而形成的闭合区域.OpenGL规定,一个多边形必须是一个“凸多边形”. ...

  9. OpenGL学习进程(7)第五课:点、边和图形(二)边

    本节是OpenGL学习的第五个课时,下面介绍OpenGL边的相关知识: (1)边的概念: 数学上的直线没有宽度,但OpenGL的直线则是有宽度的.同时,OpenGL的直线必须是有限长度,而不是像数学概 ...

随机推荐

  1. CTSC2016&&APIO2016游记

    4.30 下午衡中放假,我们因为比赛的缘故提前到中午12:00放假 然后我爸爸说要来接我,直到下午两点多他才到,然后衡中宿舍的楼管阿姨死活不给我开门 莫名其妙的等到了三点多快四点的时候我才跟实验班的一 ...

  2. python 利用smtp发送邮件,html格式

    def send_mail(to_list, sub, context):#sentmail to the maillist ''' to_list: 发送给谁 sub: 主题 context: 内容 ...

  3. .NET中操作SQLite

    C#操作SQLite Database C#下SQLite操作驱动dll下载:System.Data.SQLite C#使用SQLite步骤: (1)新建一个project (2)添加SQLite操作 ...

  4. 89. Gray Code

    题目: The gray code is a binary numeral system where two successive values differ in only one bit. Giv ...

  5. JDBC学习总结(四)

    JDBC对LOB的读写 在JDBC中提供了java.sql.Blob和java.sql.Clob,两个类分别代表BLOB和CLOB数据.         · BLOB(Binary Large Obj ...

  6. python 有关矩阵行列的存取 np.array

    初始化 a = range() a = np.array(a) a = a.reshape(,) a [[ 0  1  2  3]  [ 4  5  6  7]  [ 8  9 10 11]  [12 ...

  7. Mac + IDEA + JRebel破解方法.

    [重要提示]---最佳人生 一.只推荐当计算机无法访问互联网时使用本破解文件. 二.如果可以访问互联网,建议直接到JRebel官网注册JRebel会员获取[正版永久免费]使用的授权码.JRebel会员 ...

  8. (三)C#关于txt文件的读取和写入

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

  9. C#sqlbulkcopy的优化

    最近在进行项目的优化.现在部分数据的拷贝时间过长.需要进行上线前的优化,尝试,批次的数量和拷贝次数的之间的合理数值关系. 最近项目中使用到了SqlBulkCopy实现批量复制,在这里,我把部分代码筛选 ...

  10. Linux系统下统计目录及其子目录文件个数

    (1)查看某目录下文件的个数: ls -l |grep "^-"|wc -l 或 find ./company -type f | wc -l (2)查看某目录下文件的个数,包括子 ...