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 ...
随机推荐
- mysql insert锁机制【转】
最近再找一些MySQL锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理的不是很全,都是工作中碰到的,会持续更新 笔者能力有限,如果有不正确的,或者不到位的地方,还请大家指出来,方便你我,方便 ...
- Nodejs 发送邮件
var nodemailer = require("nodemailer");var mailTitle='http://bemupa.forumieren.com:Best Mu ...
- Django中的QuerySet
一.QuerySet 查询集,类似一个列表,包含了满足查询条件的所有项.QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作.只有你查询的时候才真正的操作数据库.意味 ...
- Luogu P3384 【【模板】树链剖分】
转载请注明出处,部分内容引自banananana大神的博客 ~~别说你不知道什么是树~~╮(─▽─)╭(帮你百度一下) 先来回顾两个问题:1,将树从x到y结点最短路径上所有节点的值都加上z 这也是个模 ...
- 2017-2018-2 20165301 实验四《Java面向对象程序设计》实验报告
2017-2018-2 20165301 实验四<Java面向对象程序设计>实验报告 一.Android Stuidio的安装测试 实验要求: 参考<Java和Android开发学习 ...
- Oracle学习笔记:wm_concat函数合并字段
在Oracle中使用wm_concat(column)可以实现字段的分组合并,逗号分隔. 例如,现有表temp_cwh_test: -- 创建临时表 create table temp_cwh_tes ...
- 调研助力4S店,解码困境谜团
关键词————4S店.汽车.销售.精准营销.闭环.用户满意度.精细化管理 一.背景 4S店是“四位一体”的汽车销售专卖店,包括了整车销售.零配件供应.售后服务.信息反馈四项功能. 信息化管理 精细化管 ...
- USACO 5.3 Big Barn
Big BarnA Special Treat Farmer John wants to place a big square barn on his square farm. He hates to ...
- LINUX 下挂载 exfat 格式 u 盘或移动硬盘
apt-get update apt-get install exfat-utils
- eclipse使用小技巧
1.eclipse中SVN无版本信息显示,window-preference-general-appeerance-label decoration-svn勾上,显示有关项目中受 SVN 控制的资源的 ...