[Android]OpenGL繪製2D幾何圖形

自定義一個活動頁面繼承GLSurfaceViewjava

import android.content.Context;
import android.opengl.GLSurfaceView;

public class DemoGLSurfaceView extends GLSurfaceView {
    
    public DemoGLSurfaceView(Context context) {
        super(context);
        DemoGLRenderer renderer = new DemoGLRenderer();
        setRenderer(renderer);
    }

}

自定義一個renderer繼承Rendererandroid

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;

public class DemoGLRenderer implements Renderer {
    
    private float[] triangleData = new float[] {
        0.1f, 0.6f , 0.0f , // 上頂點
        -0.3f, 0.0f , 0.0f , // 左頂點
        0.3f, 0.1f , 0.0f  // 右頂點
    };
    
    private FloatBuffer triangleDataBuffer;
    
    private float[] recData = new float[] {
        0.4f, 0.4f , 0.0f, // 右上頂點
        0.4f, -0.4f , 0.0f, // 右下頂點
        -0.4f, 0.4f , 0.0f, // 左上頂點    
        -0.4f, -0.4f , 0.0f // 左下頂點
    };
    
    private FloatBuffer recDataBuffer;
    
    private float[] pentacle = new float[]{
        0.4f , 0.4f , 0.0f,
        -0.2f , 0.3f , 0.0f,
        0.5f , 0.0f , 0f,
        -0.4f , 0.0f , 0f,
        -0.1f, -0.3f , 0f
    };
    
    private FloatBuffer pentacleDataBuffer;
    
    public DemoGLRenderer() {
        ByteBuffer byteBuf = ByteBuffer.allocateDirect(triangleData.length * 4);
        byteBuf.order(ByteOrder.nativeOrder());
        triangleDataBuffer = byteBuf.asFloatBuffer();
        triangleDataBuffer.put(triangleData);
        triangleDataBuffer.position(0);
        
        byteBuf = ByteBuffer.allocateDirect(recData.length * 4);
        byteBuf.order(ByteOrder.nativeOrder());
        recDataBuffer = byteBuf.asFloatBuffer();
        recDataBuffer.put(recData);
        recDataBuffer.position(0);
        
        byteBuf = ByteBuffer.allocateDirect(pentacle.length * 4);
        byteBuf.order(ByteOrder.nativeOrder());
        pentacleDataBuffer = byteBuf.asFloatBuffer();
        pentacleDataBuffer.put(pentacle);
        pentacleDataBuffer.position(0);
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        // 清除屏幕緩存和深度緩存
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        // 啓用頂點座標數據
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        // 啓用頂點顏色數據
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        // 設置當前矩陣堆棧爲模型堆棧,
        gl.glMatrixMode(GL10.GL_MODELVIEW);

        // 重置當前的模型視圖矩陣
        gl.glLoadIdentity();
        gl.glTranslatef(-0.32f, 0.35f, -1f);
        // 設置頂點的位置數據
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleDataBuffer);
        // 根據頂點數據繪製平面圖形
        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
        
        // 重置當前的模型視圖矩陣
        gl.glLoadIdentity();
        gl.glTranslatef(0.6f, 0.8f, -1.5f);
        // 設置頂點的位置數據
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, recDataBuffer);
        // 根據頂點數據繪製平面圖形
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
        
        // 重置當前的模型視圖矩陣
        gl.glLoadIdentity();
        gl.glTranslatef(0.4f, -0.5f, -1.5f);
        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        // 設置頂點的位置數據
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, pentacleDataBuffer);
        // 根據頂點數據繪製平面圖形
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 5);
        
        gl.glFinish();
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        // 設置3D視窗的大小及位置
        gl.glViewport(0, 0, width, height);
        // 將當前矩陣模式設爲投影矩陣
        gl.glMatrixMode(GL10.GL_PROJECTION);
        // 初始化單位矩陣
        gl.glLoadIdentity();
        // 計算透視視窗的寬度、高度比
        float ratio = (float) width / height;
        // 調用此方法設置透視視窗的空間大小。
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // 關閉抗抖動
        gl.glDisable(GL10.GL_DITHER);
        // 設置系統對透視進行修正
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        gl.glClearColor(0, 0, 0, 0);
        // 設置陰影平滑模式
        gl.glShadeModel(GL10.GL_SMOOTH);
        // 啓用深度測試
        gl.glEnable(GL10.GL_DEPTH_TEST);
        // 設置深度測試的類型
        gl.glDepthFunc(GL10.GL_LEQUAL);
    }

}

主頁面代碼緩存

import com.wisher.opengl.surfaceview.DemoGLSurfaceView;

import android.app.Activity;
import android.os.Bundle;

public class DemoActivity01 extends Activity {
    
    private DemoGLSurfaceView view;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        view = new DemoGLSurfaceView(this);
        setContentView(view);
    }
}

程序運行效果圖app

 

文章部分代碼源自李剛《瘋狂android講義》ide

相關文章
相關標籤/搜索