您的位置:首页 > 移动开发 > Android开发

android opengl es从零开始(二)

2016-12-02 17:03 211 查看
绘制一个平面三角形(本章所述纯属自己百度理解)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 stubgl.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中
@Overridepublic void onSurfaceChanged(GL10 gl, int w, int h) {// TODO Auto-generated method stubgl.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第六个参数,表示在原理图中的far4、投影矩阵已经设置好了,然后要操作模型了,然后gl.glMatrixMode(GL10.GL_MODELVIEW);表示对模型视景矩阵堆栈应用随后的矩阵操作继续写
@Overridepublic void onDrawFrame(GL10 gl) {// TODO Auto-generated method stubgl.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();绘制结束
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息