一、在Activity中
package com.example.administrator.createopenglview;
import android.opengl.GLSurfaceView;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
/**
* 构造OpenGL ES View
* 类似 平常创建项目显示的Hello world 一样
*
* 编译运行后 屏幕是一个绿色界面
*/
public class CreateOpenGLActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
GLSurfaceView glSurfaceView = new GLSurfaceView(this);
glSurfaceView.setRenderer(new OpenGLRenderer());
setContentView(glSurfaceView);
}
}
二、在 Renderer中
package com.example.administrator.createopenglview;
import android.opengl.GLSurfaceView;
import android.opengl.GLU;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
/**
* Created by Administrator on 2016/9/26.
* <p>
* 定义一个统一图形绘制的接口
*/
public class OpenGLRenderer implements GLSurfaceView.Renderer {
/**
* 主要用来设置一些绘制时不常变化的参数,例如:背景色,是否打开Z-buffer(去除隐藏面)等
*
* @param gl
* @param config
*/
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
//设置背景的颜色
gl.glClearColor(0f, 1f, 0f, 0.5f);
//使光滑的材质,默认不需要。
gl.glShadeModel(GL10.GL_SMOOTH);
//深度缓冲设置。
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);
}
/**
* 如果设备支持屏幕的横向和纵向切换,
* 这个方法将发生在横向<==>纵向互换时,
* 此时可以重新设置绘制的纵横比率。
*
* @param gl
* @param width
* @param height
*/
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
//将当前视图端口设置为新的大小。
gl.glViewport(0, 0, width, height);
//选择投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
//重置投影矩阵
gl.glLoadIdentity();
/**
* 建立一个透视投影矩阵
*
* gl :GL10接口
* fovy :指定领域的视角,在Y轴方向。指定方面定量determin领域在x方向上的看法。
* 高宽比的比例是x(宽度)y(高度)。
* zNear :指定观众的距离不远的剪裁平面的(总是正数)。
* zFar :指定了与观众的距离遥远的剪裁平面的(总是正数)。
*/
//计算窗口的长宽比
GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f, 100.0f);
//选择modelview矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
//重置投影矩阵
gl.glLoadIdentity();
}
/**
* 定义实际的绘图操作
*
* @param gl
*/
@Override
public void onDrawFrame(GL10 gl) {
//清除屏幕和深度缓冲。
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
}
}
三、显示结果