[原] OpenGL ES 学习笔记 (一)

摘要:
)2.OpenGL能直接绘制的是:点精灵、线、三角形,它们统称为图元,不能直接绘制四边形。

1.OpenGL ES 的坐标系在屏幕上的分布

[原] OpenGL ES 学习笔记 (一)第1张
OpenGL ES 的坐标系{x, y, z}

通过图片的三维坐标系可以知道:
- 它是一个三维坐标系 {x, y, z}
- 三维坐标中心在正方体的几何中心 {0, 0, 0}
- 整个坐标系是 [0, 1] 的点,也就是说 OpenGL 中只支持 0 ~ 1 的点 (这里所讲的 0 和 1 ,最好理解成 0 --> 无限小, 1 --> 无限大 ,它并不是指 0 个单位的长度,或 1 个单位的长度。

2. OpenGL 能直接绘制的是:点精灵、线、三角形,它们统称为 图元(Primitive),不能直接绘制四边形。

2.1 线元

Line Strip , 指首尾相接的线段,第一条线和最后一条线没有连接在一起;
Line Loops, 指首尾相接的线段,第一条线和最后一条线连接在一起,即闭合的曲线;

[原] OpenGL ES 学习笔记 (一)第2张
2.2 三角形

Triangle Strip, 指条带,相互连接的三角形
Triangle Fan, 指扇面,相互连接的三角形


[原] OpenGL ES 学习笔记 (一)第3张

                      Triangle

[原] OpenGL ES 学习笔记 (一)第4张
扇面
2.3点精灵 【主要应用在 纹理 方面】

3. OpenGL ES 2 的渲染管线

[原] OpenGL ES 学习笔记 (一)第5张
图形管线(Graphics Pipeline)

因为这里是 iOS 端的图,所以重新绘制了一下:


[原] OpenGL ES 学习笔记 (一)第6张
OpenGL ES 2 渲染流程图
primitive assembly :图元装配
rasterization: 光栅华
per-fragment operation:分段操作

4. Vertex Arrays / Buffer Objects :

4.1 Vertex Arrays Objects (简称:VAOs),顶点数组对象,就是一个数组,包含顶点坐标、颜色值、纹理坐标等数据;通过 CPU内存关联到 GPU 的内存区被 GPU 所使用;

【官方解释:Vertex data may be sourced from arrays that are stored in application memory (via a pointer) or faster GPU memory (in a buffer object).(意指:顶点数组保存在程序内存或快速GPU内存中,前者通过数组指针访问数据,后者直接通过 Buffer Objects 访问。【就是指 VAOs 或 VBOs 方式访问】)】

例如:绘制的三角形的数组(三个顶(端)点坐标)如下图:

[原] OpenGL ES 学习笔记 (一)第7张
VFVertex的定义:
[原] OpenGL ES 学习笔记 (一)第8张
4.2Vertex Buffer Objects , (简称:VBOs [ Vertex Buffer Objects ]),缓存对象,就是持有顶点数组数据或数据下标的对象【并不是指面向对象里面的对象哦,其实一块 GPU 内存块】。

【官方解释:Buffer objects hold vertex array data or indices in high-performance server memory. (意指:VBOs 是持有保存在GPU快速内存区的顶点数据或顶点数据下标的缓存对象。)】

5.Vertex Shader (顶点着色器) :

处理顶点相关的数据,包括顶点在屏幕的位置(矩阵变换),顶点处的光照计算,纹理坐标等。

顶点着色器的信号图:

[原] OpenGL ES 学习笔记 (一)第9张

5.1 输入信号:Attributes、Uniforms、Samplers (optional)

a.Attributes : 属性的意思,指每一个顶点数据;

b. Uniforms :

b.1. 统一的意思 , 是一个只读全局常量,存储在程序的常量区;
b.2. 当 Vertex Shader 和 Fragment Shader 定义了同名同类型的 Uniform 常量时,此时的 Uniform 常量就变成了全局常量(指向同一块内存区的常量);

c. Samplers (可选的) :是一个特殊的 Uniforms 保存的是 Texteures(纹理) 数据;

5.2 输出信号: Varying

Varying :
a. 它是 Vertex Shader 与 Fragment Shader 的接口,是为了解决功能性问题(两个 Shader 的信息交互);

b. 储存 Vertex Shader 的输出信息;

c. Vertex Shader 与 Fragment Shader 中必须要有必须要同名同类型的Varying 变量,不然会编译错误(因为它是两个 Shader 的信息接口啊,不一样还接什么口啊。)

5.3 交互信息: Temporary Variables

Temporary Variables :
a. 指临时变量;
b. 储存 Shader 处理过程中的中间值用的;
c. 声明在 Funtions(函数) 或 Variable(变量) 内部;

5.4 输出的内建变量: gl_Position、gl_FrontFacing、gl_PointSize

a. gl_Position ** ( highp vec4 变量 ) :

就是 Vertex Position,Vertex Shader 的输出值,而且是必须要赋值的变量;只有在 Vertex Shader 中使用才会有效**;

注意:highp vec4, highp ( high precision ) 高精度的意思,是精度限定符; vec4 ( Floating Point Vector ) 浮点向量 , OpenGL ES 的数据类型。

b. gl_PointSize ( mediump float 变量 ) :

告诉 Vertex Shader 栅格化点的尺寸(pixels,像素化),想要改变绘制点的大小就是要用这个变量 只有在 Vertex Shader 中使用才会有效

注意:mediump , mediump ( medium precision ) 中等精度的意思,是精度限定符;还有最后一个精度限制符是 lowp ( low precision ),低精度的意思。

c. gl_FrontFacing ( bool 变量 ) :
改变渲染物体的 Front Facing 和 Back Facing , 是用于处理物体光照问题的变量,双面光照(3D 物体里外光照)问题的时候才会使用的变量,只能在 Vertex Shader 中进行设置, Fragment Shader 是只读的

6. Primitive Assembly (图元装配) :

第一步,把 Vertex Shader 处理后的顶点数据组织成 OpenGL ES 可以直接渲染的基本图元:点、线、三角形;

第二步,裁剪 ( Clipping ) ,只保留在渲染区域(视锥体,视觉区域)内的图元;

第二步,剔除 ( Culling ),可通过编程决定剔除前面、后面、还是全部;

【注意】视锥体,实际上是一个三维锥体包含的空间区域,由摄影机和物体的捕捉关系形成;

[原] OpenGL ES 学习笔记 (一)第10张

视锥体

7. Rasterization ( 光栅化 ) :

                光栅化的信号图:

[原] OpenGL ES 学习笔记 (一)第11张

作用是,将基本图元(点、线、三角形)转换成二维的片元(Fragment, 包含二维坐标、颜色值、纹理坐标等等属性), 像素化基本图元使其可以在屏幕上进行绘制(显示)。

8. Texture Memory ( 纹理内存 ) :

Texture 就是指保存了图片(位图)的所有颜色的缓存;Texture Memory 就是图片的颜色(像素)内存;每一个嵌入式系统对 Texture Memory 的大小都是有限制的;

  1. 完整的 iOS 渲染绘制管线图中,向上指向 Vertex Shader 的虚线,意指 Texture Coordinate (纹理坐标)信息是通过程序提供给它的;

  2. 完整的 iOS 渲染绘制管线图中,指向 Fragment Shader 的实线,因为 Fragment Shader 处理的是光栅化后的数据,即像素数据,而 Texture 本身就是像素数据,所以 Texture Memory 可以直接当成 Fragment Shader 的输入;

9.Fragment Shader ( 片元着色器 )

片元着色器信号图:

[原] OpenGL ES 学习笔记 (一)第12张
  1. 输入信号: Varying、Uniforms、Samples
    与 Vertex Shader 的输入是同一个意思,具体请查看 Vertex Shader 处的解释~~~;

  2. 输入的内建变量:gl_FragCoord、gl_FrontFacing、gl_PointCoord

a. gl_FragCoord ( mediump vec4 只读变量 ) : 是保存窗口相对坐标的 { x, y, z, 1/w } 的变量,z 表示深度 (will be used for the fragment's depth), w 表示旋转;

b. gl_PointCoord ( mediump int 只读变量 ) : 是包含了当前片元原始点位置的二维坐标;点的范围是 [ 0, 1 ] ;

c. gl_FrontFacing : 请查看 Vertex Shader 处的解释;

  1. 输出信号 (内建变量) : gl_FragColor、gl_FragData (图上没写)

a. gl_FragColor ( mediump vec4 ) : 片元的颜色值;

b. gl_FragData ( mediump vec4 ) : 是一个数组,片元颜色集;

【注意】注:两个输出信号只能同时存在一个,就是 写了 gl_FragColor 就不要写 gl_FragData , 反之亦然;

10.Per-Fragment Operations :

              信号图:

[原] OpenGL ES 学习笔记 (一)第13张
  1. Pixel ownership test ( 像素归属测试 ) :
    判断像素在 Framebuffer 中的位置是不是为当前 OpenGL ES Context 所有,即测试某个像素是否属于当前的 Context 或是否被展示(是否被用户可见);

  2. Scissor Test ( 裁剪测试 ) :
    判断像素是否在由 glScissor* 定义的裁剪区域内,不在该剪裁区域内的像素就会被丢弃掉;

  3. Stencil Test ( 模版测试 ):
    将模版缓存中的值与一个参考值进行比较,从而进行相应的处理;

  4. Depth Test ( 深度测试 ) :
    比较下一个片段与帧缓冲区中的片段的深度,从而决定哪一个像素在前面,哪一个像素被遮挡;

  5. Blending ( 混合 ) :
    将片段的颜色和帧缓存中已有的颜色值进行混合,并将混合所得的新值写入帧缓存 (FrameBuffer) ;

  6. Dithering ( 抖动 ) :
    使用有限的色彩让你看到比实际图象更为丰富的色彩显示方式,以缓解表示颜色的值的精度不够大而导致颜色剧变的问题。


11.Render Buffer & Frame Buffer:

                      关系图:

[原] OpenGL ES 学习笔记 (一)第14张
  1. Render Buffer ( 渲染缓存 ) :

a. 简称 RBO , Render Buffer Object;
    b. 是由程序(Application)分配的 2D 图片缓存;
    c. Render Buffer 可以分配和存储颜色(color)、深度(depth)、模版(stectil)值,也可以把这三种值装载到 Frame Buffer 里面;

  1. Frame Buffer ( 帧缓存 ) :

a. 简称 FBO , Frame Buffer Object;
    b. 是颜色、深度、模板缓存装载在 FBO 上所有装载点的合集;
    c. 描述颜色、深度、模板的大小和类型的属性状态;
    d. 描述 Texture 名称的属性状态;
    e. 描述装载在 FBO 上的 Render Buffer Objects ( 渲染缓存对象 ) 的属性状态;

【注意】

FBO API 支持的操作如下:

1.只能通过 OpenGL ES 命令 ( API ) 创建 FBO 对象;

2.使用一个 EGL Context 去创建和使用多个 FBO , 即不要为每一个 FBO 对象创建一个正在渲染的上下文(rendering context);

3.创建 off-screen 的颜色、深度、模板渲染缓存和纹理需要装载在 FBO 上;

4. 通过多个 FBO 来共享颜色、深度、模板缓存;

5. 正确地装载纹理的颜色或深度到 FBO 中,避免复制操作;


12.EAGL API :
[原] OpenGL ES 学习笔记 (一)第15张

官方的是 EGL API 与平台无关,因为它本身是可以进行平台定制的,所以 iOS 下就被 Apple 定制成了 EAGL API 。

EAGL.h : 里面的核心类是 EAGLContext , 上下文环境;

EAGLDrawable.h : 用于渲染绘制输出的 EAGLContext 分类;

CAEAGLLayer : iOS 端的渲染窗口寄宿层;

[注]

  1. EGL API 设计出来的目的就是为了在 OpenGL ES 2 能在窗口系统 (屏幕 ,iOS 是 CAEAGLLayer 类为寄宿层的 View)进行渲染绘制;
  2. 可以进行 EGL 渲染的前提是:

a. 可以进行显示的设备( iOS 下当然是手机或模拟器 )

b. 创建渲染面(rendering surface), 设备的屏幕 ( on-screen ) 或 像素缓存 ( pixel Buffer ) ( off-screen )

[注]pixel Buffer , 这种 buffer 是不能直接显示的,只能成为渲染面或通过其它 API 分享出去,如: pbuffers 经常被用于 Texture 的 maps , 因为 Texture 本身也是像素嘛;

3.创建渲染上下文 ( rendering context ), 即 OpenGL ES 2 Rendering Context ;

免责声明:文章转载自《[原] OpenGL ES 学习笔记 (一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java 使用qrcode生成二维码图片或者base64字符串[分享]在ubuntu9.10下实现开机自动登录并运行自己的图形程序下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java环境变量配置(转)

java环境变量配置 windows xp下配置JDK环境变量:       1.安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为D:javajdk1.5.0_08;   2.安装完成后,右击“我的电脑”,点击“属性”;       3.选择“高级”选项卡,点击“环境变量”;       4.在“系统变量”中,设置...

Direct3D11学习:(九)绘制基本几何体

转载请注明出处:http://www.cnblogs.com/Ray1024 一、概述 Direct3D中很多复杂的几何效果都是由基本的几何体组合而成的,这篇文章中,我们来学习集中常见的基本几何体的绘制方法。 二、准备工作 我们使用一个类来组织这些绘制基本几何体的代码,以方便我们以后的使用。GeometryGenerator是一个工具类,用于生成诸如网格、...

VB.net基础知识

3.1 常量 3.1.1 什么是常量          在编程中,常常可以遇到变量和常量。顾名思义,变量就是值可以改变的量,常量是其值不可改变的量。          不可以改变的量有什么用呢?事实上,在实际编程中,常量用得很少。甚至可以用变量代替常量,当然这样做的代价是降低了程序的性能。          事实上,常量有很多用处。例如圆周率,如果每次需要...

Unity3D Shader入门指南(一)

转自:http://unity3d.9tech.cn/news/2013/1202/39031.html 自己使用unity3d也 有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚本控制,而对更深入一些的层次几乎没有了解。虽然说Unity引擎设计的初衷就是 创建简单的不需要开发者操心的谁都能用的3D引擎,但是只是肤浅的使用,可能是无法...

多线程下C#如何保证线程安全?

  多线程编程相对于单线程会出现一个特有的问题,就是线程安全的问题。所谓的线程安全,就是如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的。 线程安全问题都是由全局变量及静态变量引起的。   为了保证多线程情况下,访问静态变量的安全,可以用锁机制来...

go基础9-并发

并发 并发机制,多goroutine间的共享变量,并发问题的分析手段,解决模式,goroutine和线程区别 竞争条件 并发:无法判断多个事件执行的顺序的情形;并发安全:函数,方法,类型在线性执行或并发执行时,都能正确的返回结果;包级别的导出函数一般都是并发安全的.因为只要让变量不在多个goroutine内共享,它就一定是并发安全的;但是如果存在共享变量,...