OpenGLES学习笔记_2
1.基本概念
1.1 顶点(Vertex)
- 一个顶点就是代表几何图形的拐点,这个点有很多属性,最重要属性的是位置
// 定义顶点用数组保存,这个数组通常称为顶点属性数组
val vertices = floatArrayOf(
//Triangle
-0.5f, -0.5f,
0.5f, 0.5f,
-0.5f, 0.5f,
// Line
-0.5f, 0f,
0.5f, 0f,
// Point
0f, 0.25f
)
- 在OpenGL ES中只能绘制点、直线和三角形
- 定义三角形的顶点的时候,是逆时针的顺序排列顶点,称为卷曲顺序
1.2 片段(Fragment)
- 一个片段是一个小的、单一颜色的长方形区域,类似计算机屏幕上的一个像素
- OpenGL通过“光栅化”的过程把每个点、直线及三角形分解成大量的的小片段
1.3 OpenGL管道
-
顶点着色器(vertex shader) 针对每个顶点执行一次
-
片段着色器(fragment shader) 针对每个片段执行一次
-
管道概述
graph TB id1(读取顶点数据) --> id2(执行顶点着色器) --> id3(组装图元) --> id4(光栅化图元) --> id5(执行片段着色器) --> id6(写入帧缓冲) --> id7(显示在屏幕上)
graph TB
id1(读取顶点数据) -->
id2(执行顶点着色器) -->
id3(组装图元) -->
id4(光栅化图元) -->
id5(执行片段着色器) -->
id6(写入帧缓冲) -->
id7(显示在屏幕上)
2.着色器程序
着色器程序使用GLSL编写
2.1 顶点着色器
attribute vec4 a_Position;
void main() {
gl_Position = a_Position;
gl_PointSize = 10.0;
}
- attribute: 表示属性
- vec4: 包含4个分量的向量
- a_Position: (x,y,z,w),x、y、z对应一个三维位置,w是一个特殊的坐标
- gl_Position是程序内置变量,表示当前顶点的最终位置,必须赋值
- gl_PointSize表示点的大小,可以不赋值
2.2 片段着色器
precision mediump float;
uniform vec4 u_Color;
void main() {
gl_FragColor = u_Color;
}
- precision: 精度限定符,可选lowp、mediump、highp
- uniform: 每次都使用相同的值,除非再次改变
- u_Color: (r,g,b,a)
- gl_FragColor是内置变量,必须赋值
2.3 使用着色器
- 加载着色器
- 编译着色器
- 链接着色器
- 验证着色器
- 使用着色器
注:具体代码参考GLUtil工具类,使用着色器实际上是通过使用句柄实现的,实际上是int类型的数据。
3.绘制
在使用着色器的时候,需要传递数据到OpenGL中,通过FloatBuffer实现数据的传递。
-
顶点数据
// 三角形 val vertices = floatArrayOf( -0.5f, -0.5f, 0.5f, -0.5f, 0f, 0.5f ) // 顶点数据 val vertexData = ByteBuffer // 申请了一块本地内存,大小为数组的长度*数据类型所占的字节数 .allocateDirect(vertices.size * 4) // 按照本地字节序组织内容 .order(ByteOrder.nativeOrder()) // 转换为FloatBuffer类型 .asFloatBuffer() // 把顶点放到FloatBuffer .put(vertices) // 从最开始的位置读取数据 vertexData.position(0)
-
参考资料
OpenGL ES应用开发实践指南(Android卷),第二章、第三章
-
代码链接