Android OPenGL 初体验

本文介绍了一个简单的OpenGL示例,展示了如何使用OpenGL绘制图形并添加翻转效果。文章详细讲解了顶点数组的概念,并介绍了多种基本几何图形的绘制方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚开始学习OpenGL 先简单的绘制个图形,加上翻转效果,后续学习如何使用着色器。最终实现播放YUV格式的图片。

先上图:

这里写图片描述

public class MainActivity extends Activity implements IOpenGLDemo {

    private GLSurfaceView mGLSurfaceView;
    float[] vertices = new float[] { -0.25f, 0.25f, 0, -0.25f, -0.25f, 0, 0.25f, -0.25f, 0, 0.25f, 0.25f, 0 };
    byte[] indices = new byte[] { 0, 1, 2, 1, 2, 3 };
    float range = 0.0f;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mGLSurfaceView = new GLSurfaceView(this);
        mGLSurfaceView.setRenderer(new OpenGLRenderer(this));
        setContentView(mGLSurfaceView);
    }

    @Override
    public void DrawScene(GL10 gl) {
        //顶点坐标buffer
        ByteBuffer buffer = ByteBuffer.allocateDirect(vertices.length * 4);
        buffer.order(ByteOrder.nativeOrder());
        FloatBuffer vertex = buffer.asFloatBuffer();
        vertex.put(vertices);
        vertex.position(0);
        //顶点坐标连接顺序   (0,1,2)围成一个三角形  (1,2,3)围成一个三角形
        ByteBuffer indicBuff = ByteBuffer.allocateDirect(indices.length * 2);
        indicBuff.order(ByteOrder.nativeOrder());
        indicBuff.put(indices);
        indicBuff.position(0);

        gl.glLoadIdentity();
        //拉远摄像机的距离
        gl.glTranslatef(0, 0, -4);
        //旋转
        gl.glRotatef(range, 0, -1, 0);
        range++;
        if (range == 360) {
            range = 0;
        }

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        //打开顶点输入管线
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        //输入顶点坐标
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertex);
        gl.glColor4f(1, 0, 0, 1);
        //连接坐标点
        gl.glDrawElements(GL10.GL_TRIANGLES, 6, GL10.GL_UNSIGNED_SHORT, indicBuff);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

    }

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

    @Override
    protected void onPause() {
        super.onPause();
        mGLSurfaceView.onPause();
    }
}
public class OpenGLRenderer implements Renderer {
    private final IOpenGLDemo opengldemo;

    public OpenGLRenderer(IOpenGLDemo demo) {
        opengldemo = demo;
    }

    @Override
    public void onDrawFrame(GL10 arg0) {
        if (opengldemo != null) {
            opengldemo.DrawScene(arg0);
        }
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        //sets the current view port to the new size
        gl.glViewport(0, 0, width, height);
        //select the projection matrix
        gl.glMatrixMode(GL10.GL_PROJECTION);
        //reset the projection matrix
        gl.glLoadIdentity();
        //calculate the aspect ratio of the windows
        GLU.gluPerspective(gl, 45.0f, (float)width/(float)height, 0.1f, 100.0f);
        //Select the modelview matrix
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        //reset the modelview matrix
        gl.glLoadIdentity();
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // Set the background color to black ( rgba ).
        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
        // Enable Smooth Shading, default not really needed.
        gl.glShadeModel(GL10.GL_SMOOTH);
        // Depth buffer setup.
        gl.glClearDepthf(1.0f);
        // Enables depth testing.
        gl.glEnable(GL10.GL_DEPTH_TEST);
        // The type of depth testing to do.
        gl.glDepthFunc(GL10.GL_LEQUAL);
        // Really nice perspective calcu
    }
    public static interface IOpenGLDemo {
        void DrawScene(GL10 gl);
    }
}

点,线段,三角形都是通过顶点来定义的,也就是顶点数组来定义。对应平面上的一系列顶点,可以看出一个个孤立的点 (Point),也可以两个两个连接成线段 (Line Segment) ,也可以三个三个连成三角形 (Triangle)。这些对一组顶点的不同解释就定义了 Android OpenGL ES 可以绘制的基本几何图形,下面定义了 OpenGL ES 定义的几种模式:

GL_POINTS

绘制独立的点。
这里写图片描述

GL_LINE_STRIP

绘制一系列线段。
这里写图片描述

GL_LINE_LOOP

类同上,但是首尾相连,构成一个封闭曲线。
这里写图片描述

GL_LINES

顶点两两连接,为多条线段构成。
这里写图片描述

GL_TRIANGLES

每隔三个顶点构成一个三角形,为多个三角形组成。
这里写图片描述

GL_TRIANGLE_STRIP

每相邻三个顶点组成一个三角形,为一系列相接三角形构成。
这里写图片描述

GL_TRIANGLE_FAN

以一个点为三角形公共顶点,组成一系列相邻的三角形。
这里写图片描述

以上模式对应到 Android 渲染方法:

OpenGL ES 提供了两类方法来绘制一个空间几何图形:

public abstract void glDrawArrays(int mode, int first, int count) 使用 VetexBuffer 来绘制,顶点的顺序由 vertexBuffer 中的顺序指定。
public abstract void glDrawElements(int mode, int count, int type, Buffer indices) ,可以重新定义顶点的顺序,顶点的顺序由 indices Buffer 指定。
其中 mode 为上述解释顶点的模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值