1. 程式人生 > >OpenGL基礎之繪製

OpenGL基礎之繪製

OpenGL繪製函式!

繪製方式 說明
GL_POINTS點) 繪製點
GL_LINES(線段) 連個點一組進行點的繪製,如果只有一個點就會捨棄這個點
GL_LINES_STRIP(條帶線) 按照頂點順序連線頂點
GL_LINES_LOOP(迴圈線) 按照頂點順序連線頂點,最後一個點連線第一點
GL_TRIANGLES(三角形) 三個點一組,如果不夠三個點就會捨棄 多餘的點
GL_TRIANGLE_STRIP(三角形帶) 頂點按照順序依次 組成三角形繪製,最後實際形成的是一個三角型帶
GL_TRIANGLE_FAN(三角形扇面) 將第一個點作為中心點,其他點作為邊緣點,繪製一系列的組成扇形的三角形
/**
 * 繪製點
 * @author qiaosen
 * @date 2018/3/16
 */

public class Points extends OpenGLUtils {
    private IntBuffer verIntBuffer, colorIntBuffer;
    private
ByteBuffer indbuffer; public Points() { init(); } // 初始化 private void init() { //比例 int UNIT_SIZE = 10000; //頂點資料(xyz) int ver[] = new int[]{ -2 * UNIT_SIZE, 3 * UNIT_SIZE, 0, 1 * UNIT_SIZE, 1 * UNIT_SIZE, 0, -1
* UNIT_SIZE, -2 * UNIT_SIZE, 0 }; //建立頂點緩衝 verIntBuffer = getIntBuffer(ver); //支援65536色彩通道 int one = 65536; //頂點個數=顏色個數 //顏色資料(RGB A) int color[] = new int[]{ one, 0, 0, 0, one, 0, 0, 0, one, 0, 0, 0, one, 0, 0, 0 }; //建立頂點顏色緩衝 colorIntBuffer = getIntBuffer(color); // 索引 byte indices[] = new byte[]{ 0,3,2 }; // 建立頂點索引緩衝 indbuffer = getByteBuffer(indices); } public void drawSelf(GL10 gl){ // 啟用頂點陣列座標 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 啟用頂點顏色陣列座標 gl.glEnableClientState(GL10.GL_COLOR_ARRAY); // 設定 畫筆 //給畫筆指定頂點資料 gl.glVertexPointer(3,//座標個數xyz GL10.GL_FIXED,//頂點的資料型別 0,//間隔 預設0 verIntBuffer);///頂點資料 //給畫筆指定頂點顏色資料 gl.glColorPointer(4,//顏色組成個數 GL10.GL_FIXED,//顏色的資料型別 0,//間隔 預設0 colorIntBuffer);///頂點顏色資料 //設定頂點大小 gl.glPointSize(10); //繪製(索引法) gl.glDrawElements(GL10.GL_POINTS,//繪製模型(點1 線段3 三角形3) 3,//索引個數 GL10.GL_UNSIGNED_BYTE,//資料型別 indbuffer);//索引資料 } }

這裡寫圖片描述

/**
 *
 * @author qiaosen
 * @date 2018/3/15
 */
// 繪製線
public class Lines extends OpenGLUtils {
    private IntBuffer verIntBuffer, colorIntBuffer;
    private ByteBuffer indbuffer;

    public Lines() {
        //初始化View
        init();
    }

    private void init() {
        //比例
        int UNIT_SIZE = 10000;
        //頂點資料(xyz)
        int ver[] = new int[]{
                -2 * UNIT_SIZE,
                3 * UNIT_SIZE,
                0,
                1 * UNIT_SIZE,
                1 * UNIT_SIZE,
                0,
                -1 * UNIT_SIZE,
                -2 * UNIT_SIZE,
                0,
                2 * UNIT_SIZE,
                -3 * UNIT_SIZE,
                0
        };
        //建立頂點緩衝
        verIntBuffer = getIntBuffer(ver);
        //支援65536色彩通道
        int one = 65536;
        //頂點個數=顏色個數
        //顏色資料(RGB A)
        int color[] = new int[]{
                one, 0, 0, 0, one, 0, 0, 0, one, 0, 0, 0, one, 0, 0, 0
        };
        //建立頂點緩衝
        colorIntBuffer = getIntBuffer(color);
        //索引
        byte indices[] = new byte[]{
                0, 3, 2, 1
        };
        //建立頂點索引緩衝
        indbuffer = getByteBuffer(indices);
    }

    public void drawSelf(GL10 gl) {
        //啟用頂點陣列座標
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        //啟用頂點顏色陣列座標
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        //設定“畫筆”
        //給畫筆指定頂點資料
        gl.glVertexPointer(3//座標個數xyz
                , GL10.GL_FIXED//頂點的資料型別
                , 0//間隔 預設0
                , verIntBuffer);///頂點資料
        //給畫筆指定頂點顏色資料
        gl.glColorPointer(4//顏色組成個數
                , GL10.GL_FIXED//顏色的資料型別
                , 0//間隔 預設0
                , colorIntBuffer);///頂點顏色資料
        gl.glLineWidth(10);
//        //繪製(索引法)
        gl.glDrawElements(GL10.GL_LINES //繪製模型(點1 線段3 三角形3)
                , 4//索引個數
                , GL10.GL_UNSIGNED_BYTE//資料型別
                , indbuffer);//索引資料

    }

}

這裡寫圖片描述

/**
 *
 * @author qiaosen
 * @date 2018/3/15
 */
// 三角形
public class Triangle extends OpenGLUtils {
        private IntBuffer verIntBuffer, colorIntBuffer;
        private ByteBuffer indbuffer;

        public Triangle() {
            init();
        }

        //初始化view
        private void init() {
            int UNIT_SIZE = 10000;//比例
            //頂點資料(xyz)
            int ver[] = new int[]{
                    -2 * UNIT_SIZE,
                    5 * UNIT_SIZE,
                    0,
                    1 * UNIT_SIZE,
                    6 * UNIT_SIZE,
                    0,
                    -8 * UNIT_SIZE,
                    -8 * UNIT_SIZE,
                    0,
                    };
            //建立頂點緩衝
            verIntBuffer = getIntBuffer(ver);
            int one = 65536;//支援65536色彩通道
            //頂點個數=顏色個數
            //顏色資料(RGB A)
            int color[] = new int[]{
                    one, 0, 0, 0, one, 0, 1, 0, one, 0, 1, 0
            };
            //建立頂點緩衝
            colorIntBuffer = getIntBuffer(color);
        }

        public void drawSelf(GL10 gl) {
            //啟用頂點陣列座標
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            //啟用頂點顏色陣列座標
            gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
            //設定“畫筆”
            //給畫筆指定頂點資料
            gl.glVertexPointer(3//座標個數xyz
                    , GL10.GL_FIXED//頂點的資料型別
                    , 0//間隔 預設0
                    , verIntBuffer);///頂點資料
            //給畫筆指定頂點顏色資料
            gl.glColorPointer(4//顏色組成個數
                    , GL10.GL_FIXED//顏色的資料型別
                    , 0//間隔 預設0
                    , colorIntBuffer);///頂點顏色資料
            gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
        }
}

這裡寫圖片描述

/**
 *
 * @author qiaosen
 * @date 2018/3/15
 */
//多邊形
public class Polygon extends OpenGLUtils {
    private FloatBuffer verBuffer;
    private FloatBuffer colorBuffer;
    private int verNum;

    public Polygon() {
        init();
    }

    //初始化
    private void init() {
        int length = 45;//邊長
        //頂點個數
        verNum = (360 / length + 2);
        float ver[] = new float[verNum * 3];
        float color[] = new float[verNum * 4];
        //計數器
        int count = 0;
        int count2 = 0;
        int one = 65536;//支援65536色彩通道
        for (int i = 0; i < 360 + length; i += length) {
            double di = Math.toRadians(i);

            ver[count++] = (float) (Math.cos(di) - Math.sin(di));
            ver[count++] = (float) (Math.cos(di) + Math.sin(di));
            ver[count++] = 0;

            color[count2++]=  0;
            color[count2++]=  one;
            color[count2++]=  one;
            color[count2++]=  one;
        }

        verBuffer = getFloatbuffer(ver);
        colorBuffer = getFloatbuffer(color);
    }

    public void drawSelf(GL10 gl) {
        //啟用頂點陣列座標
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        //啟用頂點顏色陣列座標
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        //設定“畫筆”
        //給畫筆指定頂點資料
        gl.glVertexPointer(3//座標個數xyz
                , GL10.GL_FLOAT//頂點的資料型別
                , 0//間隔 預設0
                , verBuffer);///頂點資料
        //給畫筆指定頂點顏色資料
        gl.glColorPointer(4//顏色組成個數
                , GL10.GL_FLOAT//顏色的資料型別
                , 0//間隔 預設0
                , colorBuffer);///頂點顏色資料
        gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, verNum);
    }
}

這裡寫圖片描述

/**
 * 繼承GLSurfaceView 初始化GLSurfaceView
 * @author qiaosen
 * @date 2018/3/16
 */

public class DGLView extends GLSurfaceView {
    /**畫點**/
    Points mPoints;
    /**畫線**/
    Lines mLines;
    /**畫三角形**/
    Triangle mTriangle;
    /**畫多變形**/
    Polygon mPolygon;

    public DGLView(Context context) {
        super(context);
        init();
    }
    //初始化
    private void init() {
        //  渲染器
        setRenderer(new DGLRender());

        setRenderMode(RENDERMODE_CONTINUOUSLY);
        //  渲染模式  2中
        //  RENDERMODE_CONTINUOUSLY  主動渲染 一直重新整理
        //  RENDERMODE_WHEN_DIRTY  被動渲染 需要requestRender();重新整理

    }

    private class DGLRender implements Renderer {

        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            //關閉抗抖動 :(對於可用顏色較少的系統 ,可以犧牲解析度,通過顏色抖動來增加顏色數量)
            gl.glDisable(GL10.GL_DITHER);
            //設定背景為黑色 RGBA
            gl.glClearColor(0,0,0,0);
            //設定hint模式 (快速模式)
            gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
            //開啟深度測試(3D裡面)
            gl.glEnable(GL10.GL_DEPTH_TEST);

//            mPoints = new Points();
//            mLines = new Lines();
//            mTriangle = new Triangle();
            mPolygon = new Polygon();

        }

        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            //設定視口
            //x y 手機螢幕原點座標
            //width height 視口大小
            gl.glViewport(0,0,width,height);
            //設定矩陣(投影矩陣)
            gl.glMatrixMode(GL10.GL_PROJECTION);
            gl.glLoadIdentity();
            //得到寬高比
            float r = (float)width/height;
            //設定視角
            gl.glFrustumf(-r,r,-1,1,1,20);

        }

        @Override
        public void onDrawFrame(GL10 gl) {
            //清除顏色和深度快取
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
            //設定矩陣((模型矩陣)
            gl.glMatrixMode(GL10.GL_MODELVIEW);
            gl.glLoadIdentity();
            gl.glTranslatef(0,0,-3.0f);
            //繪製
            /**畫點**/
//            mPoints.drawSelf(gl);
            /**畫線**/
//            mLines.drawSelf(gl);
            /**畫三角形**/
//            mTriangle.drawSelf(gl);
            /**畫多邊形**/
            mPolygon.drawSelf(gl);

        }
    }
}
public class MainActivity extends AppCompatActivity {
    DGLView mDGLView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDGLView = new DGLView(this);
        setContentView(mDGLView);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mDGLView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mDGLView.onPause();
    }
}

demo下載地址