[TOC]
摘要
本章描述了OpenGL ES支持的图元类型和几何对象,并且解释了如何绘制它们。然后描述了图元装配阶段,它发生在顶点shader处理完图元的顶点之后。在图元装配阶段,详细介绍了裁剪、透视分割和视口变换操作。然后描述了光栅化阶段的操作,光栅化是将图元转化为一组二维片段的操作,这些片段由片段shader进行处理,代表可以在屏幕上绘制的像素。
1. Primitives
一个图元是指可以用glDrawArrays, glDrawElements, glDrawRangeElements, glDrawArraysInstanced, glDrawElementsInstanced来绘制的几何对象。图元可以用一组表示顶点位置的顶点来描述。
在OpenGL ES 3.0中可以绘制下列图元:
- Triangels
- Lines
- Point sprites
Triangles

OpenGl ES支持的画线方法有三种:GL_LINE, GL_LINE_STRIP, GL_LINE_LOOP
-
GL_LINES: 画一系列不相连的线,如果有 n 个顶点,那么就会画 n/2 个线段,如上图中 (v0, v1), (v2, v3), and (v4, v5)
-
GL_LINE_STRIP: 画一系列相连的线,如果有 n 个顶点,那么就会画 n - 1 个线段,如上图中 (v0, v1), (vl, v2), and (v2, v3)
-
GL_LINE_LOOP: 画一系列相连的线,如果有 n 个顶点,那么就会画 n 个线段,如上图中 (v0, v1), (v1, v2), (v2, v3), (v3, v4), and (v4, v0)
可以指定线段的宽度:
void glLineWidth (GLfloat width)
- width : 线的宽度,默认值是1.0
- 指定的线的宽度会受限于OpenGL ES具体实现所支持的线宽范围。此外,线的宽度将被OpenGL记住,直到由应用程序更新。
OpenGL ES所支持的线宽范围可以查询:
GLfloat lineWidthRange[2];
glGetFloatv (GL_ALIASED_LINE_WIDTH_RANGE, lineWidthRange);
对于大于1的线宽,OpenGL并没有要求去支持(也就是说,具体实现支不支持大于1的线宽都是可以的)。
Point Sprites
OpenGL ES支持的点精灵类型是 GL_POINTS。点精灵对每个指定的顶点进行绘制。点精灵通常用于将粒子效果当做点而非正方形绘制,从而实现高效渲染。点精灵是指定位置和半径的屏幕对齐的正方形,位置表示正方形的中心,半径用于计算描述点精灵的正方形的四个坐标。
gl_PointSize是顶点shader中用来输出点半径的内置变量。使用点精灵图元的顶点shader如果没有指定gl_PointSize的值,那么点的半径值就是未定义的,从而引发错误。gl_PointSize的值受到具体实现所支持的范围限制,这个范围可以查询:
GLfloat pointSizeRange[2];
glGetFloatv (GL_ALIASED_POINT_SIZE_RANGE, pointSizeRange);
默认情况下, OpenGL ES的窗口原点(0,0)是指左下点,但是对于点精灵,点坐标的原点是左上点。
gl_PointCoord是当图元为点精灵时在片段shader中的内置变量,它是一个精度为medium的vec2变量,取值范围是(0.0 ~ 1.0),可以用作纹理坐标。
#version 300 es
precisioin mediump float;
uniform sampler2D s_texSprite;
layout (location = 0) out vec4 outColor;
void main()
{
outColor = texture(s_texSprite, gl_PointCoord);
}
网友评论