OpenGL基礎(chǔ)之繪制

OpenGL繪制函數(shù)!

繪制方式 說明
GL_POINTS點(diǎn)) 繪制點(diǎn)
GL_LINES(線段) 連個(gè)點(diǎn)一組進(jìn)行點(diǎn)的繪制,如果只有一個(gè)點(diǎn)就會(huì)舍棄這個(gè)點(diǎn)
GL_LINES_STRIP(條帶線) 按照頂點(diǎn)順序連接頂點(diǎn)
GL_LINES_LOOP(循環(huán)線) 按照頂點(diǎn)順序連接頂點(diǎn)澜掩,最后一個(gè)點(diǎn)連接第一點(diǎn)
GL_TRIANGLES(三角形) 三個(gè)點(diǎn)一組跃脊,如果不夠三個(gè)點(diǎn)就會(huì)舍棄 多余的點(diǎn)
GL_TRIANGLE_STRIP(三角形帶) 頂點(diǎn)按照順序依次 組成三角形繪制,最后實(shí)際形成的是一個(gè)三角型帶
GL_TRIANGLE_FAN(三角形扇面) 將第一個(gè)點(diǎn)作為中心點(diǎn)荧止,其他點(diǎn)作為邊緣點(diǎn),繪制一系列的組成扇形的三角形
/**
 * 繪制點(diǎn)
 * @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;
        //頂點(diǎn)數(shù)據(jù)(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
        };
        //創(chuàng)建頂點(diǎn)緩沖
        verIntBuffer = getIntBuffer(ver);
        //支持65536色彩通道
        int one = 65536;
        //頂點(diǎn)個(gè)數(shù)=顏色個(gè)數(shù)
        //顏色數(shù)據(jù)(RGB A)
        int color[] = new int[]{
                one, 0, 0, 0,
                one, 0, 0, 0,
                one, 0, 0, 0,
                one, 0, 0, 0
        };
        //創(chuàng)建頂點(diǎn)顏色緩沖
        colorIntBuffer = getIntBuffer(color);
        // 索引
        byte indices[] = new byte[]{
                0,3,2
        };
        // 創(chuàng)建頂點(diǎn)索引緩沖
        indbuffer = getByteBuffer(indices);

    }

    public void drawSelf(GL10 gl){
        // 啟用頂點(diǎn)數(shù)組坐標(biāo)
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        // 啟用頂點(diǎn)顏色數(shù)組坐標(biāo)
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        // 設(shè)置 畫筆
        //給畫筆指定頂點(diǎn)數(shù)據(jù)
        gl.glVertexPointer(3,//坐標(biāo)個(gè)數(shù)xyz
                GL10.GL_FIXED,//頂點(diǎn)的數(shù)據(jù)類型
                0,//間隔 默認(rèn)0
                verIntBuffer);///頂點(diǎn)數(shù)據(jù)

        //給畫筆指定頂點(diǎn)顏色數(shù)據(jù)
        gl.glColorPointer(4,//顏色組成個(gè)數(shù)
                GL10.GL_FIXED,//顏色的數(shù)據(jù)類型
                0,//間隔 默認(rèn)0
                colorIntBuffer);///頂點(diǎn)顏色數(shù)據(jù)
        //設(shè)置頂點(diǎn)大小
        gl.glPointSize(10);
        //繪制(索引法)
        gl.glDrawElements(GL10.GL_POINTS,//繪制模型(點(diǎn)1 線段3 三角形3)
                3,//索引個(gè)數(shù)
                GL10.GL_UNSIGNED_BYTE,//數(shù)據(jù)類型
                indbuffer);//索引數(shù)據(jù)

    }
}
8D7EEE84-237C-46B6-B610-CAD9D3ECF4CE.png
/**
 *
 * @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;
        //頂點(diǎn)數(shù)據(jù)(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
        };
        //創(chuàng)建頂點(diǎn)緩沖
        verIntBuffer = getIntBuffer(ver);
        //支持65536色彩通道
        int one = 65536;
        //頂點(diǎn)個(gè)數(shù)=顏色個(gè)數(shù)
        //顏色數(shù)據(jù)(RGB A)
        int color[] = new int[]{
                one, 0, 0, 0, one, 0, 0, 0, one, 0, 0, 0, one, 0, 0, 0
        };
        //創(chuàng)建頂點(diǎn)緩沖
        colorIntBuffer = getIntBuffer(color);
        //索引
        byte indices[] = new byte[]{
                0, 3, 2, 1
        };
        //創(chuàng)建頂點(diǎn)索引緩沖
        indbuffer = getByteBuffer(indices);
    }

    public void drawSelf(GL10 gl) {
        //啟用頂點(diǎn)數(shù)組坐標(biāo)
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        //啟用頂點(diǎn)顏色數(shù)組坐標(biāo)
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        //設(shè)置“畫筆”
        //給畫筆指定頂點(diǎn)數(shù)據(jù)
        gl.glVertexPointer(3//坐標(biāo)個(gè)數(shù)xyz
                , GL10.GL_FIXED//頂點(diǎn)的數(shù)據(jù)類型
                , 0//間隔 默認(rèn)0
                , verIntBuffer);///頂點(diǎn)數(shù)據(jù)
        //給畫筆指定頂點(diǎn)顏色數(shù)據(jù)
        gl.glColorPointer(4//顏色組成個(gè)數(shù)
                , GL10.GL_FIXED//顏色的數(shù)據(jù)類型
                , 0//間隔 默認(rèn)0
                , colorIntBuffer);///頂點(diǎn)顏色數(shù)據(jù)
        gl.glLineWidth(10);
//        //繪制(索引法)
        gl.glDrawElements(GL10.GL_LINES //繪制模型(點(diǎn)1 線段3 三角形3)
                , 4//索引個(gè)數(shù)
                , GL10.GL_UNSIGNED_BYTE//數(shù)據(jù)類型
                , indbuffer);//索引數(shù)據(jù)

    }

}
23419D9C-4246-4C60-945B-3DFADE14441D.png
/**
 *
 * @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;//比例
            //頂點(diǎn)數(shù)據(jù)(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,
                    };
            //創(chuàng)建頂點(diǎn)緩沖
            verIntBuffer = getIntBuffer(ver);
            int one = 65536;//支持65536色彩通道
            //頂點(diǎn)個(gè)數(shù)=顏色個(gè)數(shù)
            //顏色數(shù)據(jù)(RGB A)
            int color[] = new int[]{
                    one, 0, 0, 0, one, 0, 1, 0, one, 0, 1, 0
            };
            //創(chuàng)建頂點(diǎn)緩沖
            colorIntBuffer = getIntBuffer(color);
        }

        public void drawSelf(GL10 gl) {
            //啟用頂點(diǎn)數(shù)組坐標(biāo)
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            //啟用頂點(diǎn)顏色數(shù)組坐標(biāo)
            gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
            //設(shè)置“畫筆”
            //給畫筆指定頂點(diǎn)數(shù)據(jù)
            gl.glVertexPointer(3//坐標(biāo)個(gè)數(shù)xyz
                    , GL10.GL_FIXED//頂點(diǎn)的數(shù)據(jù)類型
                    , 0//間隔 默認(rèn)0
                    , verIntBuffer);///頂點(diǎn)數(shù)據(jù)
            //給畫筆指定頂點(diǎn)顏色數(shù)據(jù)
            gl.glColorPointer(4//顏色組成個(gè)數(shù)
                    , GL10.GL_FIXED//顏色的數(shù)據(jù)類型
                    , 0//間隔 默認(rèn)0
                    , colorIntBuffer);///頂點(diǎn)顏色數(shù)據(jù)
            gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
        }
}
06E27014-2E58-4818-9EB4-9796A58A6B7E.png
/**
 *
 * @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;//邊長
        //頂點(diǎn)個(gè)數(shù)
        verNum = (360 / length + 2);
        float ver[] = new float[verNum * 3];
        float color[] = new float[verNum * 4];
        //計(jì)數(shù)器
        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) {
        //啟用頂點(diǎn)數(shù)組坐標(biāo)
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        //啟用頂點(diǎn)顏色數(shù)組坐標(biāo)
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        //設(shè)置“畫筆”
        //給畫筆指定頂點(diǎn)數(shù)據(jù)
        gl.glVertexPointer(3//坐標(biāo)個(gè)數(shù)xyz
                , GL10.GL_FLOAT//頂點(diǎn)的數(shù)據(jù)類型
                , 0//間隔 默認(rèn)0
                , verBuffer);///頂點(diǎn)數(shù)據(jù)
        //給畫筆指定頂點(diǎn)顏色數(shù)據(jù)
        gl.glColorPointer(4//顏色組成個(gè)數(shù)
                , GL10.GL_FLOAT//顏色的數(shù)據(jù)類型
                , 0//間隔 默認(rèn)0
                , colorBuffer);///頂點(diǎn)顏色數(shù)據(jù)
        gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, verNum);
    }
}
B554564D-119D-44A9-B674-6BDE11E200DE.png
/**
 * 繼承GLSurfaceView 初始化GLSurfaceView
 * @author qiaosen
 * @date 2018/3/16
 */

public class DGLView extends GLSurfaceView {
    /**畫點(diǎn)**/
    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  主動(dòng)渲染 一直刷新
        //  RENDERMODE_WHEN_DIRTY  被動(dòng)渲染 需要requestRender();刷新

    }

    private class DGLRender implements Renderer {

        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            //關(guān)閉抗抖動(dòng) :(對(duì)于可用顏色較少的系統(tǒng) ,可以犧牲分辨率跃巡,通過顏色抖動(dòng)來增加顏色數(shù)量)
            gl.glDisable(GL10.GL_DITHER);
            //設(shè)置背景為黑色 RGBA
            gl.glClearColor(0,0,0,0);
            //設(shè)置hint模式 (快速模式)
            gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
            //開啟深度測(cè)試(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) {
            //設(shè)置視口
            //x y 手機(jī)屏幕原點(diǎn)坐標(biāo)
            //width height 視口大小
            gl.glViewport(0,0,width,height);
            //設(shè)置矩陣(投影矩陣)
            gl.glMatrixMode(GL10.GL_PROJECTION);
            gl.glLoadIdentity();
            //得到寬高比
            float r = (float)width/height;
            //設(shè)置視角
            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);
            //設(shè)置矩陣((模型矩陣)
            gl.glMatrixMode(GL10.GL_MODELVIEW);
            gl.glLoadIdentity();
            gl.glTranslatef(0,0,-3.0f);
            //繪制
            /**畫點(diǎn)**/
//            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下載地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末危号,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子素邪,更是在濱河造成了極大的恐慌外莲,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兔朦,死亡現(xiàn)場(chǎng)離奇詭異偷线,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)烘绽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門淋昭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人安接,你說我怎么就攤上這事翔忽。” “怎么了盏檐?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵歇式,是天一觀的道長。 經(jīng)常有香客問我胡野,道長材失,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任硫豆,我火速辦了婚禮龙巨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘熊响。我一直安慰自己旨别,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布汗茄。 她就那樣靜靜地躺著秸弛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洪碳。 梳的紋絲不亂的頭發(fā)上递览,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音瞳腌,去河邊找鬼绞铃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嫂侍,可吹牛的內(nèi)容都是我干的儿捧。 我是一名探鬼主播冷离,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼纯命!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痹栖,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤亿汞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后揪阿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疗我,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年南捂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吴裤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡溺健,死狀恐怖麦牺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鞭缭,我是刑警寧澤剖膳,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站岭辣,受9級(jí)特大地震影響吱晒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沦童,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一仑濒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧偷遗,春花似錦墩瞳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箩溃,卻和暖如春瞭吃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涣旨。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工歪架, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人霹陡。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓和蚪,卻偏偏與公主長得像止状,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子攒霹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容