zoukankan      html  css  js  c++  java
  • OpenGL ES学习001---绘制三角形

    PS:OpenGL ES是什么?

    OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。OpenGL ES 是从 OpenGL 裁剪的定制而来的,去除了glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性。经过多年发展,现在主要有两个版本,OpenGL ES 1.x 针对固定管线硬件的,OpenGL ES 2.x 针对可编程管线硬件。OpenGL ES 1.0 是以 OpenGL 1.3 规范为基础的,OpenGL ES 1.1 是以 OpenGL 1.5 规范为基础的,它们分别又支持 common 和 common lite两种profile。lite profile只支持定点实数,而common profile既支持定点数又支持浮点数。 OpenGL ES 2.0 则是参照 OpenGL 2.0 规范定义的,common profile发布于2005-8,引入了对可编程管线的支持。

    百度百科有详细说明。

    下面我们来绘制三角形,大家都知道OpenGL 基础只能 画点、点线、三角形。如果想要画矩形,就要两个三角形来拼接,中间可以随意设置颜色。如果用点线的话,中间就会是空的,我们就没有办法加入颜色。

    三维效果类似于如图:

    本例绘制三角形效果图:

    1:首先要创建一个Activity文件,添加一个画布,GLSurfaceView可以在xml文件中定义,也可以直接动态创建对象,本文是动态添加对象

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    //        setContentView(R.layout.activity_main);
            GLSurfaceView view = new GLSurfaceView(this);
            view.setRenderer(new OpenGLRenderer());//添加渲染器
             setContentView(view);
    
    
    
        }
    

    2:创建渲染器OpenGLRenderer,渲染器就是用来画图的,大小、形状、颜色等。

    实现接口并重写三个方法。

     
    
    class OpenGLRenderer implements GLSurfaceView.Renderer {
    
            public OpenGLRenderer(){    
    
            }
    
            //写不常变的属性,如背景颜色
            @Override
            public void onSurfaceCreated(GL10 gl, EGLConfig config) {
                gl.glClearColor(0.0f, 0f, 0f, 0.5f);
                // 启用顶点数组(否则glDrawArrays不起作用)
                gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            }
    
            //期间的变化
            @Override
            public void onSurfaceChanged(GL10 gl, int width, int height) {
                gl.glViewport(0,0,width,height);//设置大小
            }
            private float[] mTriangleArray = {
                    // X, Y, Z 这是一个直角三角形,中心点为屏幕中心
                    -0.5f, 0.5f, 0, -0.5f, -0.5f, 0, 0.5f, -0.5f, 0 };
            //画图操作
            @Override
            public void onDrawFrame(GL10 gl) {
               Log.i("111", "onDrawFrame");
                // 清除屏幕和深度缓存(如果不调用该代码, 将不显示glClearColor设置的颜色)
                // 同样如果将该代码放到 onSurfaceCreated 中屏幕会一直闪动
                gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
                gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
               
            }
        }
    

    3:具体绘制

    //画图操作
            @Override
            public void onDrawFrame(GL10 gl) {
    
    
                Log.i("111", "onDrawFrame");
                // 清除屏幕和深度缓存(如果不调用该代码, 将不显示glClearColor设置的颜色)
                // 同样如果将该代码放到 onSurfaceCreated 中屏幕会一直闪动
                gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    
                gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
    
                FloatBuffer mTriangleBuffer = BufferUtil.floatToBuffer(mTriangleArray);
                gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);
                gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
                //
                gl.glLoadIdentity();
                // 平移 (矩阵相乘)//默认是剧中的,也就是说中间是xyz轴中心。
                gl.glTranslatef(-0.3f, -0.3f, 0f);
            }
    


    创建一个BufferUtil,目的是吧Array转成buffer

     
    
    static class BufferUtil {
            public static FloatBuffer mBuffer;
    
            public static FloatBuffer floatToBuffer(float[] a) {
                // 先初始化buffer,数组的长度*4,因为一个float占4个字节
                ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);
                // 数组排序用nativeOrder
                mbb.order(ByteOrder.nativeOrder());
                mBuffer = mbb.asFloatBuffer();
                mBuffer.put(a);
                mBuffer.position(0);
                return mBuffer;
            }
        }
    





  • 相关阅读:
    Element.scrollIntoView()
    dot.js
    微信小程序页面跳转导航wx.navigateTo和wx.redirectTo
    小程序swiper 滑块视图容器
    小程序表单提交
    自适应宽度圆角导航如何实现
    PC端和移动端一些奇葩兼容性问题
    如何实现两行内容增多和一行内容增多,多余的内容显示省略号
    表单提交判断,数据只能提交一次判断
    改变CSS世界纵横规则的writing-mode属性
  • 原文地址:https://www.cnblogs.com/cmusketeer/p/8016458.html
Copyright © 2011-2022 走看看