1.顶点、直线及三角形介绍
在OpenGL中,只能绘制点、直线和三角形,所有东西的结构都是从一个顶点开始。一个顶点就是一个代表几何对象的拐角的点,它有很多附加属性,其中最终要的属性就是位置,它代表这个顶点在空间中的定位。
- 在代码中定义顶点
如在我们的MyRenderer类的构造函数中添加如下代码构建一个长方形
public MyRenderer(Context context) {
this.context = context;
float[] tableVertices = {
0f, 0f,
0f, 14f,
9f, 14f,
9f, 0f
};
}
- 在代码中构建三角形
在OpneGL中,将单独的点放在一个组里构建出三角形。
public MyRenderer(Context context) {
this.context = context;
float[] tableVerticesWithTriangles = {
// Triangle 1
0f, 0f,
9f, 14f,
0f, 14f,
// Triangle 2
0f, 0f,
9f, 0f,
9f, 14f
};
}
这里说明下三角形的卷曲顺序:定义三角形时候,总是以逆时针顺序排列顶点,因为这样可以优化性能。
2.OpenGL存取顶点属性数组
利用java一个特殊的类集合分配本地内存块,将java的数据复制到本地内存。本地内存可以被本地环境存取,而不受垃圾回收器管控。
public MyRenderer(Context context) {
this.context = context;
·········
vertexData = ByteBuffer
.allocateDirect(tableVerticesWithTriangles.length * BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer();
vertexData.put(tableVerticesWithTriangles);
}
使用 ByteBuffer.allocateDirect() 分配一块本地内存,这块内存大小为 tableVerticesWithTriangles.length * BYTES_PER_FLOAT 。调用 order(ByteOrder.nativeOrder()) 保证一个平台使用同样的排序,调用 asFloatBuffer() 得到一个可以反映底层字节的FloatBuffer类实例,之后调用 vertexData.put(tableVerticesWithTriangles) 将数据从Dalvik内存复制到本地内存。
3.使用着色器
将图形结构画到屏幕上之前,在OpenGL管道中传递,需要着色器的子例程。有两种类型的着色器,分别是顶点着色器和片段着色器。
- 创建顶点着色器
在项目中的“res”文件夹下创建“raw”文件夹,并创建如 vertex_shader.glsl文件,代码如下:
attribute vec4 a_Position;
void main()
{
gl_Position = a_Position;
gl_PointSize = 10.0;
}
- 创建片段着色器
片段着色器的主要目的就是告诉GPU每个片段的最终颜色。
precision mediump float;
uniform vec4 u_Color;
void main()
{
gl_FragColor = u_Color;
}
4.将颜色映射到显示屏上
OpenGL假定颜色互相之间是线性关系,这些基本颜色值被限定在范围[0,1]内,0代表缺少此种基本颜色,1则代表此颜色的最大强度。