绘制一个平面三角形(本章所述纯属自己百度理解)
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();绘制结束