Android API开发之OpenGL开发之Android OpenGL之使用GLSurfaceView创建一个3D旋转的图形

本文讲述使用GLSurfaceView创建一个3D旋转的图形

 

代码1:OpenGLESActivity.java

 

public class OpenGLESActivity extends AppCompatActivity {

 


    private GLSurfaceView glSurfaceView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 如果本设备支持OpenGl ES 2.0
        if (IsSupported()) {
            // 先建GLSurfaceView实例
            glSurfaceView = new GLSurfaceView(this);
            // 创建渲染器实例
            MyRenderer mRenderer = new MyRenderer();
            // 设置渲染器
            glSurfaceView.setRenderer(mRenderer);
            // 显示SurfaceView
            setContentView(glSurfaceView);
        }else{
            Toast.makeText(OpenGLESActivity.this,"此设备不支持OpenGL ES 2.0!",Toast.LENGTH_LONG).show();
        }
    }


    /**
     * 当前设备是否支持OpenGL ES 2.0
     * */


    private boolean IsSupported() {
        ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
        boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000
                ||(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1 && (Build.FINGERPRINT.startsWith("generic")
                || Build.FINGERPRINT.startsWith("unknown")
                || Build.MODEL.contains("google_sdk")
                || Build.MODEL.contains("Emulator")
                || Build.MODEL.contains("Android SDK built for x86")));
        return supportsEs2;
    }


    /**
     * GLSurfaceView.Renderer实现类
     * */


    public class MyRenderer implements GLSurfaceView.Renderer {


        /**
         * 1.定义立方体的8个顶点
         * */


        float[] cubeVertices = {
                //左面
                -0.5f,0.5f,0.5f,
                -0.5f,-0.5f,0.5f,
                -0.5f,0.5f,-0.5f,
                -0.5f,-0.5f,-0.5f,


                //右面
                0.5f, 0.5f,0.5f,
                0.5f,-0.5f,0.5f,
                0.5f,-0.5f,-0.5f,
                0.5f,0.5f,-0.5f ,


                //前面
                -0.5f,0.5f,0.5f,
                -0.5f,-0.5f,0.5f,
                0.5f,-0.5f,0.5f,
                0.5f, 0.5f,0.5f,


                //后面
                0.5f,-0.5f,-0.5f,
                0.5f,0.5f,-0.5f,
                -0.5f,0.5f,-0.5f,
                -0.5f,-0.5f,-0.5f,


                //上面
                -0.5f,0.5f,0.5f,
                0.5f, 0.5f,0.5f,
                0.5f,0.5f,-0.5f,
                -0.5f,0.5f,-0.5f,


                //下面
                -0.5f,-0.5f,0.5f,
                0.5f,-0.5f,0.5f,
                0.5f,-0.5f,-0.5f,
                -0.5f,-0.5f,-0.5f
        };


        /**
         * 2.各个位置对应的颜色数组
         * */


        float []  cubeColors = {
                1f,0f,0f,1f ,
                0f,1f,0f,1f,
                0f,0f,1f,1f,
                1f,0f,0f,1f,


                1f,0f,0f,1f ,
                0f,1f,0f,1f,
                0f,0f,1f,1f,
                1f,0f,0f,1f,


                1f,0f,0f,1f ,
                0f,1f,0f,1f,
                0f,0f,1f,1f,
                1f,0f,0f,1f,


                1f,0f,0f,1f ,
                0f,1f,0f,1f,
                0f,0f,1f,1f,
                1f,0f,0f,1f,




                1f,0f,0f,1f ,
                0f,1f,0f,1f,
                0f,0f,1f,1f,
                1f,0f,0f,1f,


                1f,0f,0f,1f ,
                0f,1f,0f,1f,
                0f,0f,1f,1f,
                1f,0f,0f,1f,
        };


        /**
         * 索引数组
         * */


        private short[] indices={
                0,1,2,
                0,2,3,


                4,5,6,
                4,6,7,


                8,9,10,
                8,10,11,


                12,13,14,
                12,14,15,


                16,17,18,
                16,18,19,


                20,21,22,
                20,22,23,
        };


        private float rotate;// 控制旋转的角度
        private FloatBuffer VerticesBuffer;//浮点形缓冲数据
        private FloatBuffer Colorbuffer;//浮点型颜色数据
        private ShortBuffer indexbuffer;//浮点型索引数据


        public MyRenderer() {
            //获取浮点形缓冲数据
            VerticesBuffer = Utils.getFloatBuffer(cubeVertices);
            //获取浮点型颜色数据
            Colorbuffer= Utils.getFloatBuffer(cubeColors);
            //获取浮点型索引数据
            indexbuffer= Utils.getShortBuffer(indices);
        }


        /**
         * onSurfaceCreated方法 Surface创建的时候调用
         * */


        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            gl.glClearColor(0, 0, 0, 0);
        }


        /**
         * onSurfaceChanged方法 Surface改变的的时候调用
         * */


        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            // 设置3D视窗的大小及位置
            gl.glViewport(0, 0, width, height);
        }


        /**
         * onDrawFrame方法 在Surface上绘制的时候调用
         * */


        @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.glLoadIdentity();
            // 沿着Y轴旋转
            gl.glRotatef(rotate, 0f, 1f, 0f);
            // 设置顶点的位置数据
            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, VerticesBuffer);
            // 设置顶点的颜色数据
            gl.glColorPointer(4, GL10.GL_FLOAT, 0, Colorbuffer);
            //绘制三角形
            gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_SHORT, indexbuffer);


            gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
            // 旋转角度增加1
            rotate-=1;
        }
    }


    /**
     * onPause方法 glSurfaceView.onPause
     * */


    @Override
    protected void onPause() {
        super.onPause();
        if (glSurfaceView != null) {
            glSurfaceView.onPause();
        }
    }


    /**
     * onResume方法 glSurfaceView.onResume
     * */


    @Override
    protected void onResume() {
        super.onResume();
        if (glSurfaceView != null) {
            glSurfaceView.onResume();
        }
    }

 

 

 

 

}

 

 

 

 

代码2:Utils.java

 

public class Utils {


    /**
     * 获取浮点形缓冲数据 float 数组
     */


    public static FloatBuffer getFloatBuffer(float[] vertexs) {
        FloatBuffer buffer;
        ByteBuffer qbb = ByteBuffer.allocateDirect(vertexs.length * 4);
        qbb.order(ByteOrder.nativeOrder());
        buffer = qbb.asFloatBuffer();
        buffer.put(vertexs);
        buffer.position(0);
        return buffer;
    }


    /**
     * 获取字节型缓冲数据 Byte 数组
     */


    public static ShortBuffer getShortBuffer(short[] vertexs) {
        ShortBuffer buffer;
        ByteBuffer qbb = ByteBuffer.allocateDirect(vertexs.length * 2);
        qbb.order(ByteOrder.nativeOrder());
        buffer = qbb.asShortBuffer();
        buffer.put(vertexs);
        buffer.position(0);
        return buffer;
    }


 

}

 

运行结果:

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenGL ES是一种用于开发图形应用程序的开放式图形编程接口。它被广泛用于Android系统上的游戏开发以及其他需要高性能图形渲染的应用程序中。下面是关于OpenGL ESAndroid开发中的一些要点: 1. OpenGL ES的版本:Android支持多个不同版本的OpenGL ES,如OpenGL ES 1.0、1.1、2.0和3.0。开发者根据自己的需求选择合适的版本。 2. 渲染管线:OpenGL ES使用可编程的渲染管线来处理图形渲染。开发者可以通过创建顶点着色器和片段着色器程序来自定义渲染过程,从而实现各种效果。 3. 缓冲对象:开发者可以使用OpenGL ES来创建和管理缓冲对象,如顶点缓冲对象(VBO)和帧缓冲对象(FBO)。这些缓冲对象用于存储图形数据,提高绘制效率。 4. 纹理映射:OpenGL ES允许开发者将纹理映射到三维对象上,以实现更加逼真的图形效果。开发者可以通过加载纹理图像并将其映射到顶点上来创建细节丰富的模型。 5. 事件处理:OpenGL ES提供了一些函数来处理触摸事件、加速度计变化等输入信息。开发者可以使用这些函数来实现交互式的图形应用程序。 6. OpenGL ES的集成:在Android开发中,开发者可以通过GLSurfaceView类来集成OpenGL ESGLSurfaceViewAndroid提供的一个用于显示OpenGL ES图形的视图类。 总结来说,OpenGL ESAndroid开发中用于实现高性能图形渲染的重要工具。开发者可以利用它来创建各种各样的游戏和图形应用程序,并通过自定义着色器和纹理映射等技术来增加细节和逼真度。 ### 回答2: OpenGLES是一种用于开发移动设备和嵌入式系统的图形渲染API,它主要用于在Android平台上开发游戏和图形应用程序。使用OpenGLES开发者可以利用硬件加速的图形渲染功能,提供流畅的图形效果和高性能的图形渲染。 在Android平台上进行OpenGLES开发,首先需要在应用程序中引入OpenGLES库文件,并进行相关的环境设置。然后,开发者可以使用OpenGLES API提供的各种函数和方法来创建图形对象、设置渲染状态、进行变换和纹理映射等操作。同时,还可以使用OpenGLES提供的着色器语言,自定义渲染管线,实现更高级的图形效果。 在开发过程中,需要注意OpenGLES使用的坐标系统是以屏幕为中心的坐标系,而不是传统的以左上角为原点的坐标系。因此,在创建图形对象时,需要进行坐标转换。此外,还需要注意管理资源和内存,避免内存泄漏和资源浪费。 在实际开发中,可以利用OpenGLES创建各种图形效果,如平面、立体、光照、阴影等。同时,还可以通过OpenGLES实现用户交互,如触摸屏幕,操作物体的变换等。此外,还可以使用OpenGLES与其他Android组件进行交互,如利用OpenGL ES绘制图像进行相机预览、视频播放等。 总之,OpenGLESAndroid开发中具有重要的作用,能够实现高性能的图形渲染和丰富的图形效果,为开发者提供了强大的工具和技术支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值