opengl es 2.0只支持三种绘画单元:
三角形,直线和点精灵。
GL_TRIANGLES
GL_TRIANGLES_STRIP
GL_TRIANGLES_FAN
GL_LINES
GL_LINE_STRIP
GL_LINE_LOOP
GL_POINTS(这个是点精灵)
void glLineWidth(GLfloat width);
GLfloat lw[2];
glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE,lw);
void glDrawArrays(
GLenum mode,
//GL_TRIANGLES
GLint first,
//在顶点数组里面的第一个顶点的索引
GLsizei count
//有几个索引
)
(GL_TRIANGLES,0,6)表示画两个三角形
(GL_TRIANGLE_STRIP,0,5)表示画3个三角形(0,1,2),(2,1,3),(2,3,4)
由于这个函数没有使用索引,因此他的顶点数组里面的顶点需要是排好序的。
void glDrawElements(
GLenum mode,
//GL_TRIANGLES等。
GLsizei count,
//索引个数
GLenum type,
//索引数据的数据类型,
const GLvoid* indices
//数据指针
)
索引数据的类型有:
GL_UNSIGNED_BYTE
GL_UNSIGNED_SHORT
GL_UNSIGNED_INT(这个不一定支持,需要OES_element_index_uint扩展)
void glFrontFace(GLenum dir)
//GL_CW GL_CCW
void glEnable(GL_CULL_FACE);
void glCullFace(GL_FRONT GL_BACK GL_FRONT_AND_BACK);
点精灵:
点精灵是一个屏幕对齐的正方形,有position和radius。
在shader里面有内建变量gl_PointSize,用来输出点的半径。有顶点shader输出。
GLfloat pointsizeRange[2];
glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE,pointsizeRange);
得到允许的点精灵的大小。
注意窗口的坐标表示是(0,0)到(left,bottom)。
而点精灵的坐标原点是:(left,top)。
gl_PointCoord是片段shader的内建变量,vec2类型,mediump精度。
在shader里面绘制点精灵的例子:
uniform sampler2D s_texSprite;
void main(void)
{
gl_FragColor = texture2D(s_texSprite,gl_PointCoord);
}
基元处理流程:
物体的坐标点 根据基元的类型跟视见体做裁剪,去掉看不到的部分
跟modelviewprojection相乘,然后再x/w, y/w, z/w得到normalized设备坐标(-1.0到1.0)。
视口转换阶段:
用到两个函数:
glViewport(x,y,w,h)和glDepthRange(near, far);
利用这个(x/w, y/w, z/w)坐标,在根据视口的尺寸,就可以得到物体在屏幕上的x,y坐标。
根据z/w和glDepthRange()指定的near和far深度值。
具体计算方式请看
多边形偏移:
当绘制两个完全重叠的物体时,渲染出来的效果会出现相互渗透的现象,这是由于精度有限的缘故,这种现象如果光靠提高精度
是不能完全解决的,所以需要使用多边形偏移技术,若开启多边形偏移,在做深度测试和深度写入之前,给片段的深度值加
一个delta,然后用这个值进行深度测试,如果深度测试通过,则会写入原本的深度值,而不是depth+delta。
glEnable(GL_POLYGON_OFFSET_FILL);
glDisable(GL_POLYGON_OFFSET_FILL);
void glPolygonOffset(GLfloat factor, GLfloat units);
depth offset = m*factor+r*units;
书上个了个例子,factor=-1.0f,units=-2.0f。