基本概念

基本功能:几何图形、变换、着色、光照、贴图
高级功能:曲面图元、光栅操作、景深、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. lintcode:在二叉查找树中插入节点

    题目:  在二叉查找树中插入节点 给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树.  样例 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样 ...

  2. DELPHI中IDE宏录制小用

    用DELPHI的宏可以做一些非常简便的工作, 它是记录键盘的动作,如果我们将一些有规律的动作,用宏来进行操作,就可以达到事半功倍的效果,前提是编写的代码风格比较整洁. 宏是以Ctrl + Shift ...

  3. HTTP会话原理解释与应用

    一.什么是会话 首先解释一下什么是会话.在计算机术语中,会话是指一个终端用户与交互系统进行通讯的过程,比如从输入账户密码进入操作系统到退出操作系统就是一个会话过程.会话较多用于网络上,TCP的三次握手 ...

  4. 246. Strobogrammatic Number

    题目: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at ups ...

  5. MySQL学习笔记一

    MySQL 学习笔记 一 一.数据库简单介绍 1. 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系 ...

  6. voliecty indexOf的写法

    Velocity allows you to use all Java methods available in your objects. So just write as if it was Ja ...

  7. uva1639 Candy

    组合数,对数. 这道题要用到20w的组合数,如果直接相乘的话,会丢失很多精度,所以用去对数的方式实现. 注意指数,因为取完一次后,还要再取一次才能发现取完,所以是(n+1)次方. double 会爆掉 ...

  8. iOS开发:Swift多线程NSThread的使用

    一:创建线程,NSThread创建线程常用的三种方式: //1:手动创建启动 let thread:NSThread = NSThread(target: self, selector:"d ...

  9. UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design

    题意: 给出一个有向带权图,找到若干个圈,使得每个点恰好属于一个圈.而且这些圈所有边的权值之和最小. 分析: 每个点恰好属于一个有向圈 就等价于 每个点都有唯一后继. 所以把每个点i拆成两个点,Xi  ...

  10. HDU 3336 (KMP next性质) Count the string

    直接上传送门好了,我觉得他分析得非常透彻. http://972169909-qq-com.iteye.com/blog/1114968 #include <cstdio> #includ ...