基于Android的OpenGL ES 2.0学习笔记(2)

搬运以前在csdn的博文
接(1)章
这次尝试画一个三角形,并且加上一个旋转动画的效果。以下为三角类的代码:

public class CZTriangle implements ICZgles {  
    private static final String TAG = "CZPoint";  
  
    private static final String VERTEX_SHADER  
            = "attribute vec4 a_Position;"  
            + "uniform mat4 u_rotate;"  
            + "void main() {"  
            + "    gl_Position = u_rotate * a_Position;"  
            + "}";  
    private static final String FRAGMENT_SHADER  
            = "void main() {"  
            + "    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);"  
            + "}";  
  
    private int mAPosition;  
    private int mURotate;  
    private int mUFragmentColor;  
    private FloatBuffer mFB;  
  
    private float[] mVer = {  
            0.0f, 0.0f, 0.0f,  
            0.5f, -0.5f, 0.0f,  
            -0.5f, -0.5f, 0.0f  
    };  
  
    private float angle = 0.0f;  
  
    @Override  
    public void init(int program, int vertexShader, int fragmentShader) {  
        //mUFragmentColor = GLES20.glGetUniformLocation(program, "u_FragmentColor");  
        ByteBuffer bb = ByteBuffer.allocateDirect(mVer.length * 4);  
        bb.order(ByteOrder.nativeOrder());  
        mFB = bb.asFloatBuffer();  
        mFB.put(mVer);  
        mFB.position(0);  
  
        int[] vb = new int[1];  
        GLES20.glGenBuffers(1, vb, 0);  
        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vb[0]);  
        GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, 4 * mFB.limit(), mFB, GLES20.GL_STATIC_DRAW);  
        mAPosition = GLES20.glGetAttribLocation(program, "a_Position");  
        mURotate = GLES20.glGetUniformLocation(program, "u_rotate");  
        GLES20.glVertexAttribPointer(mAPosition, 3, GLES20.GL_FLOAT, false, 0, 0);  
        //GLES20.glVertexAttribPointer(mAPosition, 3, GLES20.GL_FLOAT, false, 0, mFB);  
    }  
  
    @Override  
    public String getVertexShader() {  
        return VERTEX_SHADER;  
    }  
  
    @Override  
    public String getFragmentShader() {  
        return FRAGMENT_SHADER;  
    }  
  
    @Override  
    public void draw() {  
        float[] matrix = new float[16];  
        Matrix.setRotateM(matrix, 0, angle, 0.0f, 0.0f, 1.0f);  
        angle += 1.0f;  
        if (angle > 360.0f) {  
            angle = 0.0f;  
        }  
        GLES20.glUniformMatrix4fv(mURotate, 1, false, matrix, 0);  
        //GLES20.glUniform4f(mUFragmentColor, 1.0f, 0.0f, 0.0f, 1.0f);  
        //GLES20.glVertexAttribPointer(mAPosition, 3, GLES20.GL_FLOAT, false, 0, mFB);  
        GLES20.glEnableVertexAttribArray(mAPosition);  
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);  
        GLES20.glDisableVertexAttribArray(mAPosition);  
    }  
} 

opengl es 2.0并没有提供移动旋转等运动的api,都需要定义四维矩阵和当前坐标相乘去实现相应的效果,也就是我们常说的齐次坐标。至于如何定义出这个四维矩阵就不在这篇文章里细说了。
可以通过Matrix这个类来辅助定义各种矩阵类型,例如旋转的话可以使用以下方法:

Matrix.setRotateM(长度为16的数组, 偏移量, 旋转角度, 旋转轴的x, 旋转轴的y, 旋转轴的z);
得到相应的矩阵后传给shader和当前坐标矩阵相乘

同时这次大概也熟悉了一下2.0的api,感觉大部分api都和shader联系的太紧密了,不结合底层的东西很难说清楚,还得继续深入学习。

总之感觉opengl es的编程思想并非面向对象,很多东西太低层,搞起来不太适应。

WebGL虽然也是基于opengl es,但是有个three js这么个脚本,很多东西做起来比android容易上手

你可能感兴趣的:(基于Android的OpenGL ES 2.0学习笔记(2))