OpenGL渲染管线

Wiki

PipeLine

主要需要关注三个步骤

Vertex Specification

大部分c++/java代码主要负责这部分逻辑,包括顶点数据、纹理坐标、贴图加在等等。

可以理解为,所有android上所有 GLES20.glXX 方法都发生在此步骤。

Vertex Shader

纹理着色器,主要作用是将顶点数据转化为屏幕坐标、颜色、深度以及uv等自定义数据。

Fragment Shader

主要作用是将顶点着色器产生的数据转化为一个argb值,这个值最终展示在屏幕上。

纹理贴图一般发生在这个阶段。

基本代码结构

Code

manifest声明

<uses-feature android:glEsVersion="0x00020000"/>

GLSurfaceView初始化

val glPanel = findViewById<GLSurfaceView>(R.id.glPanel)
glPanel.setEGLContextClientVersion(2)
glPanel.setEGLConfigChooser(8, 8, 8, 8, 16, 0)
glPanel.setRenderer(this)
glPanel.renderMode = GLSurfaceView.RENDERMODE_CONTINUOUSLY

Renderer

override fun onDrawFrame(ignored: GL10?) {
    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT)
}

override fun onSurfaceChanged(ignored: GL10?, width: Int, height: Int) {
    glViewport(0, 0, width, height)
}

override fun onSurfaceCreated(ignored: GL10?, config: EGLConfig?) {
    glClearColor(0.3f, 0.6f, 0.9f, 1f)
    glClearDepthf(1f)
}