Android OPenGL 初体验

来源:互联网 发布:mac pro 2016电池容量 编辑:程序博客网 时间:2024/06/15 14:57

刚开始学习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 为上述解释顶点的模式。

原创粉丝点击