OpenGL 三角形
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) }
共勉!!!!
原始碼