OpenGL ES绘图

来源:互联网 发布:cydia微信软件源 编辑:程序博客网 时间:2024/05/16 06:16

自己学习练手。

1.在配置文件中添加如下代码

    <uses-feature        android:glEsVersion="0x00020000"        android:required="true" />    <supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />    <supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />

2.定义简单的surfaceview

class MySurfaceView extends GLSurfaceView {    private final MyGLRenderer mRenderer;    public MySurfaceView(Context context) {        super(context);        // 创建一个 OpenGL ES 2.0 上下文        setEGLContextClientVersion(2);        mRenderer = new MyGLRenderer();        // 为 GLSurfaceView 设置一个渲染器        setRenderer(mRenderer);    }}
3.定义一个渲染器

class MyGLRenderer  implements GLSurfaceView.Renderer{    private Triangle mTriangle;    private Square   mSquare;    @Override    /**     *设置视图的OpenGL ES环境     */    public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {        // 设置背景颜色        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);        // 初始化三角形        mTriangle = new Triangle();    }    @Override    /**     * 视图的几何变化就调用     */    public void onSurfaceChanged(GL10 gl10, int width, int height) {        GLES20.glViewport(0, 0, width, height);        Log.e("onsurfaceChanged","onsurfaceChanged");    }    @Override    /**     * 重绘视图     */    public void onDrawFrame(GL10 gl10) {        // 重绘背景颜色        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);        mTriangle.draw();    }    public static int loadShader(int type, String shaderCode){        //创建顶点着色器类型(GLES20.GL_VERTEX_SHADER)        // 或片段着色器类型(GLES20.GL_FRAGMENT_SHADER)        int shader = GLES20.glCreateShader(type);        //将源代码映射到着色器并编译它        GLES20.glShaderSource(shader, shaderCode);        GLES20.glCompileShader(shader);        return shader;    }}

4.定义实现图形:三角形

public class Triangle {    private final String vertexShaderCode =            "attribute vec4 vPosition;" +                    "void main() {" +                    "  gl_Position = vPosition;" +                    "}";    private final String fragmentShaderCode =            "precision mediump float;" +                    "uniform vec4 vColor;" +                    "void main() {" +                    "  gl_FragColor = vColor;" +                    "}";    private FloatBuffer vertexBuffer;    // 这个数组中每个顶点的坐标数    static final int COORDS_PER_VERTEX = 3;    static float triangleCoords[] = {   // 以逆时针顺序:            0.0f, 0.622008459f, 0.0f, // top            -0.5f, -0.311004243f, 0.0f, // bottom left            0.5f, -0.311004243f, 0.0f  // bottom right    };    // 设置 颜色为红色、绿色、蓝色和alpha(不透明度)值    float color[] = {0.63671875f, 0.76953125f, 0.22265625f, 1.0f};    private final int mProgram;    private int mPositionHandle;    private int mColorHandle;    private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX;    private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex    public Triangle() {        // 为形状坐标初始化顶点字节缓冲区        ByteBuffer bb = ByteBuffer.allocateDirect(                // (每个浮点数* 4字节)                triangleCoords.length * 4);        // 使用设备硬件的本地字节顺序        bb.order(ByteOrder.nativeOrder());        // 从ByteBuffer创建一个浮点缓冲区        vertexBuffer = bb.asFloatBuffer();        // 将坐标添加到FloatBuffer        vertexBuffer.put(triangleCoords);        //设置缓冲区以读取第一个坐标        vertexBuffer.position(0);//创建着色器        int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER,                vertexShaderCode);        int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER,                fragmentShaderCode);        // 创建空的OpenGL ES程序        mProgram = GLES20.glCreateProgram();        // 添加顶点着色器到程序        GLES20.glAttachShader(mProgram, vertexShader);        //添加片段着色程序到程序        GLES20.glAttachShader(mProgram, fragmentShader);        //创建OpenGL ES程序执行程序        GLES20.glLinkProgram(mProgram);    }    public void draw() {        // 添加程序到OpenGL ES环境        GLES20.glUseProgram(mProgram);        // 处理顶点着色器的vPosition成员        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");        // 为三角形顶点启用句柄        GLES20.glEnableVertexAttribArray(mPositionHandle);        // 准备三角形坐标数据        GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,                GLES20.GL_FLOAT, false,                vertexStride, vertexBuffer);        // 处理片段着色器的vColor成员        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");        // 为绘制三角形设置颜色        GLES20.glUniform4fv(mColorHandle, 1, color, 0);        // 画一个三角形        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);        // 禁用顶点数组        GLES20.glDisableVertexAttribArray(mPositionHandle);    }}
5.调用surfaceview
public class MainActivity extends AppCompatActivity {private SurfaceView mysSurfaceView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mysSurfaceView = new MySurfaceView(this);        setContentView(mysSurfaceView);    }}



原创粉丝点击