OpenGL ES -顶点着色器
顶点着色器输入包括:
- 着色器程序 - 描述顶点上执行操作的顶点着色器源代码和可执行文件
- 顶点着色器输入 - 顶点数组数据
- 统一变量 - 着色器使用的不变的数据
- 采样器 - 代表顶点着色器使用纹理的特殊同一变量类型
图元是能够被OpenGL ES 绘制的几何物体,如三角形、线条或者精灵。在图元组合过程中,对每个图元必须判断是否位于投影 截体内,如果图元不完全在平截体内部,将被视图平截体剪贴,如果完全在平截体外,将被 丢弃,然后顶点位置被转变为屏幕坐标,剔除操作也能够舍弃一些图元,依据图元位于正面 还是背面,剪切和剔除后,图元进入光栅化阶段。 光栅化是转化图元为二维片段的过程,被片段着色器执行,二维的片段像素能 够被绘制在屏幕上。
Paste_Image.png图元
可以绘制图元的包括下面的函数:
- glDrawArrays
- glDrawElements
- glDrawRangeElements
- glDrawArraysInstanced
- glDrawElementsInstanced
其中这些函数可以绘制三角形、直线和点精灵。
三角形
- GL_TRIANGLES:绘制一系列单独的三角形;
- GL_TRIANGLE_STRIP:绘制一系列相互连接的三角形;
- GL_TRIANGLE_FAN:绘制一系列相连的三角形;
直线
- GL_LINES:绘制一系列不相连的线段;
- GL_LINE_STRIP:绘制一系列相连的线段;
- GL_LINE_LOOP:同上,类似;
点精灵
支持的图元是GL_POINTS,点精灵对指定的每个顶点绘制,点精灵通常用于将粒子效果当作点而非正方形绘制,从而实现高效渲染。点精灵是指定位置和半径的屏幕对齐的正方形,位置描述正方形的中心,半径用于计算描述点精灵的正方形的4个坐标,。
区别
如果你有一个由一系列顺序元素索引描述的图元,且几何形状的顶点不共享,则glDrawArrays很好用,但是,游戏或者其他3D应用程序使用的典型对象由多个三角形网格组成,其中的元素索引可能不一定按照顺序,顶点通畅在网格的三角形之间共享。
比如画一个由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指定的是真实数据的调用索引,在内存/显存占用上更节省