1. 前言

之前已经把纹理的渲染给弄出来了,但是又遇到一个新的问题,那就是图元装配,比如说我已经把图片给显示出来了,但是呢,并没有做到让它显示到具体的位置,而跟这个位置相关的则需要靠图元装配。

图元装配发生在顶点着色器处理图元顶点之后,在这一阶段,执行裁剪、透视分割和视口变换操作。而光栅化是将图元转化为一组二维片段的过程,这些片段由片段着色器处理,代表可以在屏幕上绘制的像素,发生在图元装配之后。

2. 图元

可以绘制图元的包括下面的函数:

  • glDrawArrays
  • glDrawElements
  • glDrawRangeElements
  • glDrawArraysInstanced
  • glDrawElementsInstanced

其中这些函数可以绘制三角形、直线和点精灵。

2.1 三角形

  1. GL_TRIANGLES:绘制一系列单独的三角形;
  2. GL_TRIANGLE_STRIP:绘制一系列相互连接的三角形;
  3. GL_TRIANGLE_FAN:绘制一系列相连的三角形;

2.2 直线

  1. GL_LINES:绘制一系列不相连的线段;
  2. GL_LINE_STRIP:绘制一系列相连的线段;
  3. GL_LINE_LOOP:同上,类似;

2.3 点精灵

支持的图元是GL_POINTS,点精灵对指定的每个顶点绘制,点精灵通常用于将粒子效果当作点而非正方形绘制,从而实现高效渲染。点精灵是指定位置和半径的屏幕对齐的正方形,位置描述正方形的中心,半径用于计算描述点精灵的正方形的4个坐标,。

2.4 绘制图元

OpenGL ES中有5个绘制图元的API调用,分别是文章开头谈到那5个,这里需要注意的是,前面3个是常规的非实例化绘图,后面两个才是实例化绘图。

2.4.1 glDrawArrays

glDrawArrays用元素索引为first到first+count-1的元素指定的顶点绘制mode指定的图元。需要注意的是,这里的count并不意味着越大绘制的就越多,这里仅仅是指顶点的个数,还需要看mode,是单独的还是相连的。

2.4.2 区别

如果你有一个由一系列顺序元素索引描述的图元,且几何形状的顶点不共享,则glDrawArrays很好用,但是,游戏或者其他3D应用程序使用的典型对象由多个三角形网格组成,其中的元素索引可能不一定按照顺序,顶点通畅在网格的三角形之间共享,则使用glDrawElements会比较好,这有很多原因,例如说,由于顶点重用,顶点属性数据的尺寸也较小,这也导致较小的内存占用和内存带宽需求。

比如画一个由2个3角形组成的正方形,左上角坐标是l,t,右下角坐标是r,b
使用glDrawArrays绘制时,画2个三角形,需要这样传:
(l,t),(r,t),(l,b)
(r,t),(r,b),(l,b)
而用glDrawElements画的话可以这样
float coord[4][2]={{l,t},{r,t},{r,b},{l,b}};
绘制时:
0,1,3
1,2,3

glDrawArrays传输或指定的数据是最终的真实数据,在绘制时效能更好
而glDrawElements指定的是真实数据的调用索引,在内存/显存占用上更节省。

2.4.3 几何形状实例化

几何形状实例化很高效,可以用一次API调用多次渲染具有不同属性(例如不同的变换矩阵、颜色或者大小)的一个对象。这一功能在渲染大量类似对象时很有用,例如对人群的渲染,这将会降低了向OpenGL ES引擎发送许多API调用的CPU开销处理

glDrawArraysInstanced

glDrawElementsInstanced

那如果我们想访问其中的实例对象时怎么办呢?有两种方法,分别是使用函数glVertexAttribDivisor,还有就是使用内建输入变量gl_InstanceID作为顶点着色器中的缓冲区索引,以访问每个实例的数据,不过前提是你使用的是几何形状实例化API调用,比如你使用的是非实例化绘图调用,那么gl_InstanceID将不会保存当前图元实例的索引。

2.5 图元重启

使用图元重启后,可以在一次绘图调用中渲染多个不相连的图元,之前我们绘制不相连的也就是使用glDrawArrays,这对于降低绘图API调用的开销是不利的。

我们可以通过在索引列表中插入一个特殊索引来重启一个用于索引绘图调用(如glDrawElements、glDrawElementsInstanced 或 glDrawRangeElements)的图元,这个特殊索引是该索引类型的最大可能索引,(例如,索引类型为GL_UNSIGNED_BYTE为255,而GL_UNSIGNED_SHORT则为65535)。

注意,可以使用代码去启用或者图元重启。

glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);

glDisable(GL_PRIMITIVE_RESTART_FIXED_INDEX);

3. 图元装配

前面只是讲到图元的相关知识,从这里开始便进行到真正的图元装配。

在图元装配阶段,顶点着色器输出会依次经历:裁剪,透视分割,视口变换,才会到光栅化阶段。

(不得不说,还是OpenGL 编程指南讲得更详细一些。。。)

OpenGL ES 3.0 图元装配的更多相关文章

  1. OpenGL ES 3.0: 图元重启(Primitive restart)

    [TOC] 背景概述 在OpenGL绘制图形时,可能需要绘制多个并不相连的图形.这样的情况下这几个图形没法被当做一个图形来处理.也就需要多次调用 DrawArrays 或 DrawElements. ...

  2. OpenGL ES 3.0 图元组合和光栅化(三)

    图元是能够被OpenGL ES 绘制的几何物体,如三角形.线条或者精灵.在图元组合过程 中,对每个图元必须判断是否位于投影 截体内,如果图元不完全在平截体内部,将被视图平截体剪贴,如果完全在平截体外, ...

  3. OpenGL ES 3.0 基础知识

    首先要了解OpenGL的图形管线有哪些内容,再分别去了解其中的相关的关系: 管线分别包括了顶点缓冲区/数组对象,定点着色器,纹理,片段着色器,变换反馈,图元装配,光栅化,逐片段操作,帧缓冲区.其中顶点 ...

  4. OpenGL ES 2.0 渲染管线 学习笔记

    图中展示整个OpenGL ES 2.0可编程管线 图中Vertex Shader和Fragment Shader 是可编程管线: Vertex Array/Buffer objects 顶点数据来源, ...

  5. OpenGL ES 3.0之VertexAttributes,Vertex Arrays,and Buffer Objects(九)

    顶点数据,也称为顶点属性,指每一个顶点数据.指能被用来描述每个顶点的数据,或能被所有顶点使用的常量值.例如你想绘制一个具有颜色的立方体三角形.你指定一个恒定的值用于三角形的所有三个顶点颜色.但三角形的 ...

  6. OpenGL ES 3.0之Shading Language(八)

    每个OpenGL ES 3.0程序要求一个顶点着色器和一个片段着色器去渲染一个图形.着色器概念是API 的中心,本篇将介绍着色器语言部分包含下面几项 1.变量和变量类型 2.矢量和矩阵创建及选择 3. ...

  7. 基于Cocos2d-x学习OpenGL ES 2.0系列——使用VBO索引(4)

    在上一篇文章中,我们介绍了uniform和模型-视图-投影变换,相信大家对于OpenGL ES 2.0应该有一点感觉了.在这篇文章中,我们不再画三角形了,改为画四边形.下篇教程,我们就可以画立方体了, ...

  8. 【C++ OpenGL ES 2.0编程笔记】8: 使用VBO和IBO绘制立方体 【转】

    http://blog.csdn.net/kesalin/article/details/8351935 前言 本文介绍了OpenGL ES 2.0 中的顶点缓冲对象(VBO: Vertex Buff ...

  9. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

随机推荐

  1. 使用mysql的SUBSTRING_INDEX函数解决项目中编码非重复问题的实现方案!

    一 SUBSTRING_INDEX函数介绍 作用:按关键字截取字符串 substring_index(str,delim,count) 说明:substring_index(被截取字段,关键字,关键字 ...

  2. WindowsServer2003双网卡配置

    今天突然被问起,找资料10+分钟才找到记录,因此再次记录下: route -p delete 0.0.0.0 route -p add 0.0.0.0 mask 0.0.0.0 58.240.115. ...

  3. innobackupex 相关语法讲解【转】

    innobackupex 相关语法讲解 连接服务器 The database user used to connect to the server and its password are speci ...

  4. CAS和AQS

    一.CAS CAS(Compare And Swap),即比较并交换.是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V).预期原值(A)和新值(B).如果内 ...

  5. Django中cookie和session

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  6. 【本地服务器】用nodejs搭建最简单、轻量化的http server

    1. 引言 前端程序猿主要关注的是页面,你可能根本就用不到.net,java,php等后台语言. 但是你制作出来的网页总要运行.总要测试吧?——那就免不了用到http server.我先前都是用vis ...

  7. python基础--shutil模块

    shutil模块提供了大量的文件的高级操作. 特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作.对单个文件的操作也可参见os模块. 注意 即便是更高级别的文件复制函数(shutil.cop ...

  8. java基础50 配置文件类(Properties)

    1. 配置文件类Properties的概念 主要生产配置文件与读取配置文件的信息 2.Properties要注意的细节 1.如果配置文件一旦使用了中文,那么在使用store方法生产的配置文件额时候字符 ...

  9. Oracle约束

    1.非空约束 DROP TABLE member PURGE; CREATE TABLE member( mid NUMBER, name ) NOT NULL ); 2.唯一约束 DROP TABL ...

  10. 一步一步学习IdentityServer4 (4) 处理特殊需求之-登录等待页面

    用IdentityServer3的时候登录如果采用Post方式大家会发现有中间有一个等待Submit空白页面,界面不友好,现在我想把这个修改自定义的页面Loading 在Identityserver3 ...