android opengl es从零开始(二)

绘制一个平面三角形(本章所述纯属自己百度理解)

android opengl es最重要的自然是渲染器

activity中的代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE); // (NEW)
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN); // (NEW)
        GLSurfaceView view = new GLSurfaceView(this);
        view.setRenderer(new RenderTest());
        setContentView(view);
    }
}
这个就不解释了


下面说一下RenderTest类

RenderTest实现GLSurfaceView.Renderer接口

主要的三个方法

public void onDrawFrame(GL10 gl)
public void onSurfaceChanged(GL10 gl, int w, int h)
public void onSurfaceCreated(GL10 gl, EGLConfig config)

在写代码之前,先说说opengl的原理,贴图





照相机相当于人的眼睛,眼睛的位置默认在(0,0,0),也就是原点位置,眼睛看到的东西便是反应到手机上显示的东西

中间的平面表示作图平面,右面的平面表示可见平面

near是眼睛和作图平面的距离,距离越小,看到的越大

far表示眼睛到可见平面的距离,距离越大,看到的越小


好了,知道原理,开始写代码

首先得知道模型三角形的大小和位置,定义一个数组

private float[] mTriangleArray = {
        0f,1f,0f,
        -1f,-1f,0f,
        1f,-1f,0f
};
表示三角形模型的三个顶点(注意这儿是三角形模型,而不是显示出来的三角形)
 需要把顶点信息放到buffer中,以提高绘制效率 

所以定义

private FloatBuffer mTriangleBuffer;
 
好了,全局变量都已经定义好了
开始写
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    // TODO Auto-generated method stub
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glClearColor(1.0f, 1.0f, 1.0f, 0f);
    gl.glClearDepthf(1.0f);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glDepthFunc(GL10.GL_LEQUAL);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    mTriangleBuffer = BufferUtil.floatBuffer(mTriangleArray);
}
1、gl.glClearColor(1.0f, 1.0f, 1.0f, 0f);  //设置背景颜色,这个要配合glColear使用
2、 mTriangleBuffer = BufferUtil.floatBuffer(mTriangleArray);,将顶点坐标放到buffer中



@Override
public void onSurfaceChanged(GL10 gl, int w, int h) {
    // TODO Auto-generated method stub
    gl.glViewport(0, 0, w, h);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glFrustumf(-0.5f, 0.5f, -0.5f, 0.5f, 3, 6);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
}
这个方法是在屏幕改变的时候调用,至少会调用一次

1、glViewport(0, 0, w, h)  设置显示窗口大小(就是所要显示的画布大小),这儿是设置为和屏幕一样大

2、glMatrixMode(GL10.GL_PROJECTION)设置为对投影矩阵应用随后的矩阵操作(投影矩阵是什么鬼,就是最上面原理图片中的中间的那个平面)

3、gl.glFrustumf(-0.5f, 0.5f, -0.5f, 0.5f, 3, 6),这个方法要重点说一下,他是对投影矩阵的设置,那么0.5f是多大?我的理解为:x轴1f为屏幕宽度,y轴1f为屏幕高度

这儿这样设置,就将投影矩阵设置为和屏幕同样的大小

额,说说这六个参数把

前四个参数,表示投影矩阵left,right,bottom,top

第五个参数,表示在原理图中的near

第六个参数,表示在原理图中的far

4、投影矩阵已经设置好了,然后要操作模型了,然后gl.glMatrixMode(GL10.GL_MODELVIEW);表示对模型视景矩阵堆栈应用随后的矩阵操作



继续写

@Override
public void onDrawFrame(GL10 gl) {
    // TODO Auto-generated method stub
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
    gl.glColor4f(1.0f,0,0,1);
    gl.glLoadIdentity();
    gl.glTranslatef(0.0f, 0.0f, -6.0f);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);
    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
    gl.glFinish();
}
1、glColor4f设置颜色,模式为rgba,现在是设置的红色

2、glTranslatef,记得gl.glMatrixMode(GL10.GL_MODELVIEW)吧,如果不这样设置,这儿就不可以对模型进行操作,这个方法是对模型进行移动,要注意的是,眼睛的位置为(0,0,0),眼睛看向的方向是沿着z轴负方向,所以z轴移动必须是负的,并且距离原点z轴的距离必须大于near,小于far,否则无法显示

3、glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);设置顶点

4、glDrawArrays(GL10.GL_TRIANGLES, 0, 3);绘制三角形

5、gl.glFinish();绘制结束





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值