1. 程式人生 > >android平臺下OpenGL ES 3.0繪製彩色三角形

android平臺下OpenGL ES 3.0繪製彩色三角形

OpenGL ES 3.0學習實踐

本例基於android平臺下OpenGLES3.0繪製圓點、直線和三角形

目錄

頂點著色器

#version 300 es
layout (location = 0) in vec4 vPosition;
layout (location = 1) in vec4 aColor;
out vec4 vColor;
void main() {
     gl_Position  = vPosition;
     gl_PointSize = 10.0;
     vColor = aColor;
}

上述頂點著色器的描述:

  • 第一行表示:著色器的版本,OpenGL ES 2.0版本可以不寫。
  • 第二行表示:輸入一個名為vPosition的4分量向量,layout (location = 0)
    表示這個變數的位置是頂點屬性0。
  • 第三行表示:輸入一個名為aColor的4分量向量,layout (location = 1)表示這個變數的位置是頂點屬性1。
  • 第四行表示:輸出一個名為vColor的4分量向量
  • 第八行表示:將輸入資料aColor拷貝到vColor的變數中。

片段著色器

#version 300 es
precision mediump float;
in vec4 vColor;
out vec4 fragColor;
void main() {
     fragColor = vColor;
}

上述片段著色器的描述:

  • 第一行表示:著色器的版本,OpenGL ES 2.0版本可以不寫。
  • 第二行表示:宣告著色器中浮點變數的預設精度。
  • 第三行表示: 宣告一個輸入名為vColor的4分向量
  • 第四行表示:著色器宣告一個輸出變數fragColor,這個是一個4分量的向量。
  • 第六行表示:表示將輸入的顏色值資料拷貝到fragColor變數中,輸出到顏色緩衝區。

基於sdk繪製彩色三角形

private float color[] = {
            0.0f, 1.0f, 0.0f, 1.0f,
            1.0f, 0.0f, 0.0f, 1.0f,
            0.0f, 0.0f, 1.0f, 1.0f
};

由於虛擬機器OpenGL執行環境不同,需要將虛擬機器資料傳輸到native層供其使用

建構函式中: 將顏色資料傳輸到native

colorBuffer = ByteBuffer.allocateDirect(color.length * 4)
                .order(ByteOrder.nativeOrder())
                .asFloatBuffer();
//傳入指定的資料
colorBuffer.put(color);
colorBuffer.position(0);

開始繪製:

@Override
public void onDrawFrame(GL10 gl) {
    GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);

    //準備座標資料
    GLES30.glVertexAttribPointer(0, POSITION_COMPONENT_COUNT, GLES30.GL_FLOAT, false, 0, vertexBuffer);
    //啟用頂點的控制代碼
    GLES30.glEnableVertexAttribArray(0);

    //繪製三角形顏色
    GLES30.glEnableVertexAttribArray(1);
    GLES30.glVertexAttribPointer(1, 4, GLES30.GL_FLOAT, false, 0, colorBuffer);

    GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, 3);

    //禁止頂點陣列的控制代碼
    GLES30.glDisableVertexAttribArray(0);
    GLES30.glDisableVertexAttribArray(1);
}

基於ndk繪製彩色三角形

基於ndk的繪製示例在下面的地址中,需要定義好jni的介面,原理跟上述方式型別,不再贅述

專案地址:
https://github.com/byhook/opengles4android

參考:
《OpenGL ES 3.0 程式設計指南第2版》
《OpenGL ES應用開發實踐指南Android卷》