OpenGL ES 3.0 Android 4.3开始 现在完全可以从3.0 开始了
今天闲来画一个最基本的三角形
有几个步骤
- egl环境
- 定义、加载Shader
- 定义定点、颜色
- vao vbo
- 绘画
egl 环境
egl 环境直接使用GLSurfaceView,等到后面要拍视频的时候再自己构建
glSurfaceView = findViewById(R.id.glSurfaceView)
//设置版本
glSurfaceView.setEGLContextClientVersion(3)
//设置Renderer
glSurfaceView.setRenderer(TriangleRenderer())
//更新模式
glSurfaceView.renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY
定义、加载Shader
顶点Shader
#version 300 es
layout (location = 0) in vec3 aPos;
void main() {
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
片段Shader
#version 300 es
precision mediump float;
out vec4 FragColor;
void main()
{
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
先知道这个东西、以后在慢慢消化
加载Shader
val compiled = IntArray(1)
val shader = GLES30.glCreateShader(type)
if (shader == 0) {
return 0
}
GLES30.glShaderSource(shader, shaderSrc)
GLES30.glCompileShader(shader)
GLES30.glGetShaderiv(shader, GLES30.GL_COMPILE_STATUS, compiled, 0)
if (compiled[0] == 0) {
Log.e("Shader", GLES30.glGetShaderInfoLog(shader))
GLES30.glDeleteShader(shader)
return 0
}
val vertexShader = loadShader(GLES30.GL_VERTEX_SHADER, vertShaderSrc)
val fragmentShader = loadShader(GLES30.GL_FRAGMENT_SHADER, fragShaderSrc)
Shader有两种类型1.GL_VERTEX_SHADER 2.GL_FRAGMENT_SHADER
加载完链接到程序
GLES30.glAttachShader(programObject, vertexShader)
GLES30.glAttachShader(programObject, fragmentShader)
// 链接 the program
GLES30.glLinkProgram(programObject)
这样shader的处理就完了
vao vbo
这就是把订单缓存起来
//vao
GLES30.glGenVertexArrays(1, vao, 0)
GLES30.glBindVertexArray(vao[0])
//vbo
GLES30.glGenBuffers(1, vbo, 0)
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vbo[0])
val vertexBuffer = DataUtil.createByteBuffer(vertices)
//复制数据到opengl
GLES30.glBufferData(
//顶点缓冲对象当前绑定到GL_ARRAY_BUFFER目标上
GLES30.GL_ARRAY_BUFFER,
//指定传输数据的大小(以字节为单位)
vertices.size * DataUtil.sizeof(GLES30.GL_FLOAT),
//发送的实际数据
vertexBuffer,
//GL_STATIC_DRAW :数据不会或几乎不会改变。
//GL_DYNAMIC_DRAW:数据会被改变很多。
//GL_STREAM_DRAW :数据每次绘制时都会改变
GLES30.GL_STATIC_DRAW
)
//设置定点数组指针
GLES30.glVertexAttribPointer(
//shader中 layout(location = 0)的值
0,
//顶点属性的大小。顶点属性是一个vec3,它由3个值组成,所以大小是3
3,
//数据的类型
GLES30.GL_FLOAT,
//GL_TRUE,数据被标准化,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。我们把它设置为GL_FALSE
false,
//步长,它告诉我们在连续的顶点属性组之间的间隔 字节单位
3 * DataUtil.sizeof(GLES30.GL_FLOAT),
//数据偏移量 这里只有顶点 位置数据在数组的开头,所以这里是0
0)
GLES30.glEnableVertexAttribArray(0)
//vbo end
//vao end
绘画
override fun onDrawFrame(gl: GL10?) {
GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT)
esShader.use()
GLES30.glBindVertexArray(vao[0])
GLES30.glDrawArrays(
//图元的类型
GLES30.GL_TRIANGLES,
//起始索引
0,
//多少个顶点
3)
}
共勉!!!!
源代码