Android_GLSurfaceView

使用open GL ES 绘制三角形

首先自定义一个GLSurfaceView

    class MyGLSurceView extends GLSurfaceView {

        public MyGLSurceView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public MyGLSurceView(Context context) {
            super(context);
        }
        
    }
    

再定义一个给GLSurfaceView进行渲染的渲染器Renderer,他是GLSurfaceView的内部接口类。

class MyRenderer implements GLSurfaceView.Renderer {

        @Override
        public void onDrawFrame(GL10 gl) {
            //清除缓存颜色区域
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
            //设置模型视图
            gl.glMatrixMode(GL10.GL_MODELVIEW);
            gl.glLoadIdentity();//加载单位矩阵
            //眼睛放置的位置
            //GL10 gl, float eyeX, float eyeY, float eyeZ, 眼睛放置的位置
            //float centerX, float centerY, float centerZ, 相机放置的位置
            //float upX, float upY, float upZ 相机的朝向
            GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0, 1, 0);
            //定义三角形的点x,y,z
            float[] coords = {
                    0f,0.5f,0f,
                    -0.5f,-0.5f,0f,
                    0.5f,-0.5f,0f
            };
            //存到内存缓存区
            ByteBuffer buffer = ByteBuffer.allocateDirect(coords.length *4);
            buffer.order(ByteOrder.nativeOrder());
            //放置顶点坐标
            FloatBuffer floatBuf = buffer.asFloatBuffer();
            floatBuf.put(coords);//将点存放到floatBuffer里面
            buffer.position(0);//指针指向0
            //制定绘制点的颜色
            gl.glColor4f(1f, 0f, 0f, 1f);
            //开始绘制点
            //3 三维点, type数据类型,0跨度,顶点缓冲区
            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, buffer);
            //设置绘制三角形
            gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
            
        }

        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            //设置视口区域
            gl.glViewport(0, 0, width, height);
            //设置绘制模式
            gl.glMatrixMode(GL10.GL_PROJECTION);
            //设置为单例矩阵
            gl.glLoadIdentity();
            float ration = (float)width/(float)height;
            //设置平截头体 左,右,下,上,近平面,远平面
            gl.glFrustumf(-1f, 1f, -ration, ration, 3, 7);
            
        }

        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
            //设置清屏颜色
            gl.glClearColor(1, 1, 1, 1);
            //启动绘制顶点数组
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        }
        
    }
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyGLSurceView glSurceView = new MyGLSurceView(this);
        glSurceView.setRenderer(new MyRenderer());
        setContentView(glSurceView);
    }
}

运行效果图如下:

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。