OpenGL ES 3.0 图元装配
1. 前言
之前已经把纹理的渲染给弄出来了,但是又遇到一个新的问题,那就是图元装配,比如说我已经把图片给显示出来了,但是呢,并没有做到让它显示到具体的位置,而跟这个位置相关的则需要靠图元装配。
图元装配发生在顶点着色器处理图元顶点之后,在这一阶段,执行裁剪、透视分割和视口变换操作。而光栅化是将图元转化为一组二维片段的过程,这些片段由片段着色器处理,代表可以在屏幕上绘制的像素,发生在图元装配之后。
2. 图元
可以绘制图元的包括下面的函数:
- glDrawArrays
- glDrawElements
- glDrawRangeElements
- glDrawArraysInstanced
- glDrawElementsInstanced
其中这些函数可以绘制三角形、直线和点精灵。
2.1 三角形
- GL_TRIANGLES:绘制一系列单独的三角形;
- GL_TRIANGLE_STRIP:绘制一系列相互连接的三角形;
- GL_TRIANGLE_FAN:绘制一系列相连的三角形;
2.2 直线
- GL_LINES:绘制一系列不相连的线段;
- GL_LINE_STRIP:绘制一系列相连的线段;
- 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 图元装配的更多相关文章
- OpenGL ES 3.0: 图元重启(Primitive restart)
[TOC] 背景概述 在OpenGL绘制图形时,可能需要绘制多个并不相连的图形.这样的情况下这几个图形没法被当做一个图形来处理.也就需要多次调用 DrawArrays 或 DrawElements. ...
- OpenGL ES 3.0 图元组合和光栅化(三)
图元是能够被OpenGL ES 绘制的几何物体,如三角形.线条或者精灵.在图元组合过程 中,对每个图元必须判断是否位于投影 截体内,如果图元不完全在平截体内部,将被视图平截体剪贴,如果完全在平截体外, ...
- OpenGL ES 3.0 基础知识
首先要了解OpenGL的图形管线有哪些内容,再分别去了解其中的相关的关系: 管线分别包括了顶点缓冲区/数组对象,定点着色器,纹理,片段着色器,变换反馈,图元装配,光栅化,逐片段操作,帧缓冲区.其中顶点 ...
- OpenGL ES 2.0 渲染管线 学习笔记
图中展示整个OpenGL ES 2.0可编程管线 图中Vertex Shader和Fragment Shader 是可编程管线: Vertex Array/Buffer objects 顶点数据来源, ...
- OpenGL ES 3.0之VertexAttributes,Vertex Arrays,and Buffer Objects(九)
顶点数据,也称为顶点属性,指每一个顶点数据.指能被用来描述每个顶点的数据,或能被所有顶点使用的常量值.例如你想绘制一个具有颜色的立方体三角形.你指定一个恒定的值用于三角形的所有三个顶点颜色.但三角形的 ...
- OpenGL ES 3.0之Shading Language(八)
每个OpenGL ES 3.0程序要求一个顶点着色器和一个片段着色器去渲染一个图形.着色器概念是API 的中心,本篇将介绍着色器语言部分包含下面几项 1.变量和变量类型 2.矢量和矩阵创建及选择 3. ...
- 基于Cocos2d-x学习OpenGL ES 2.0系列——使用VBO索引(4)
在上一篇文章中,我们介绍了uniform和模型-视图-投影变换,相信大家对于OpenGL ES 2.0应该有一点感觉了.在这篇文章中,我们不再画三角形了,改为画四边形.下篇教程,我们就可以画立方体了, ...
- 【C++ OpenGL ES 2.0编程笔记】8: 使用VBO和IBO绘制立方体 【转】
http://blog.csdn.net/kesalin/article/details/8351935 前言 本文介绍了OpenGL ES 2.0 中的顶点缓冲对象(VBO: Vertex Buff ...
- 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)
0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...
随机推荐
- Linux内存初始化【转】
转自:http://www.cnblogs.com/super-king/p/3291120.html start_kernel -> setup_arch 在这个函数中我们主要看这几个函数. ...
- PHP的数据库连接mysqli遍历示例
$mysqli = mysqli_init(); $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//设置超时时间,以秒为单位的连接超时时间 $m ...
- 2.Centos-Docker-shipyard中文版安装
1.准备(所有服务器都要执行) a.设置主机名和hosts vi /etc/hosts 192.168.1.2 centos-master 192.168.1.4 centos-minion-2 b. ...
- thinkphp5 IIS7.5 隐藏index.php的方法
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.we ...
- 关于move
procedure TForm4.Button1Click(Sender: TObject); var //动态数组 bytes1,bytes2: TBytes; //静态数组 bytes3,byte ...
- sqlserver中的全局变量总结
@@CONNECTIONS返回自上次启动 Microsoft? SQL Server? 以来连接或试图连接的次数.@@CPU_BUSY返回自上次启动 Microsoft? SQL Server? 以来 ...
- Python练手之爬虫
很久没更新博客了,最近自学Python,写个在百度上爬算法题题解的爬虫,第一次写爬虫..纯当练手 慢慢来.. #coding:utf-8 ''' Created on 2016年11月22日 @aut ...
- jmock2.5 基本教程
目录 第0章 概述 第1章 jmock初体验 第2章 期望 第3章 返回值 第4章 参数匹配 第5章 指定方法调用次数 第6章 指定执行序列 第7章 状态机 第0章 概述 现在的dev不是仅仅要写co ...
- 解决mysql不能远程登入的问题
mysql远程不能登入,问题就在于当时设置的账号只限制本地访问,mysql默认也只是本地访问. 之前的设置: 通过命令行登录管理MySQL服务器(提示输入密码时直接回车): mysql> /us ...
- 专业分析docker的分层存储技术
话不在多,指明要点! 联合挂载是用于将多个镜像层的文件系统挂载到一个挂载点来实现一个统一文件系统视图的途径, 是下层存储驱动(aufs.overlay等) 实现分层合并的方式. 所以严格来说,联合挂载 ...