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);//索引数据

    }
}
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;
        //顶点数据(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);//索引数据

    }

}
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;//比例
            //顶点数据(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);
        }
}
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;//边长
        //顶点个数
        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);
    }
}
B554564D-119D-44A9-B674-6BDE11E200DE.png
/**
 * 继承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下载地址

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容