最近玩玩Android的openGL,做了点注释,有用看看,没有了无视
Java代码
public class GL1 extends Activity {
private GLSurfaceView mGLSurfaceView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGLSurfaceView = new GLSurfaceView(this);
mGLSurfaceView.setRenderer(new One());
setContentView(mGLSurfaceView);
}
@Override
protected void onResume() {
super.onResume();
mGLSurfaceView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mGLSurfaceView.onPause();
}
}
/**
* 渲染器
*
* @author yaoyuan
*
*/
class One implements Renderer {
private Square square;
public One() {
square = new Square();
}
/**
* 初始化视图
*/
public void onDrawFrame(GL10 gl) {
/*
* 清空缓冲区预设值
*
* GL_COLOR_BUFFER_BIT 颜色缓冲区
*
* GL_DEPTH_BUFFER_BIT 深度缓冲区
*
* GL_STENCIL_BUFFER_BIT 模板缓冲区
*/
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
//乘一个翻译矩阵代替当前的矩阵
gl.glTranslatef(0.0f, 0.0f, -6.0f);
//画图形
square.draw(gl);
}
/**
* 视图改变时调用
*/
public void onSurfaceChanged(GL10 gl, int width, int height) {
if (height == 0) {
height = 1;
}
gl.glViewport(0, 0, width, height);
/**
* 指定当前的矩阵模式
*
* GL_MODELVIEW 模型视图 GL_PROJECTION 投影 GL_TEXTURE 纹理
*/
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
// 设置一个透视投影矩阵
GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f,
100.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
/**
* 视图创建时调用
*/
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
/*
* 设置阴影模式 1.GL_FLAT 扁平 2.GL_SMOOTH 平滑
*/
gl.glShadeModel(GL10.GL_SMOOTH);
// 指定颜色缓冲区值
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// 指定深度缓冲区值
gl.glClearDepthf(1.0f);
// 可用GL服务端功能
gl.glEnable(GL10.GL_DEPTH_TEST);
/*
* 深度缓存比较
*
* GL_NEVER 不通过
*
* GL_LESS 如果传入的深度值小于存储深度的值,通过
*
* GL_EQUAL 如果传入的传递深度值等于存储的深度值,通过
*
* GL_LEQUAL 如果传入的深度值小于或等于存储的深度值,通过
*
* GL_GREATER 如果传入的深度值大于存储深度值更大,通过
*
* GL_NOTEQUAL 如果传入的深度值不等于存储深度值,通过
*
* GL_GEQUAL 如果传入的深度值大于或等于存储深度值,通过
*
* GL_ALWAYS 始终通过
*/
gl.glDepthFunc(GL10.GL_LEQUAL);
// 指定特定于实现的提示
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
}
}
/**
* 图形
*
* @author yaoyuan
*
*/
class Square {
private FloatBuffer vertexBuffer;
private float vertices[] = {
-1.0f, 1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f
};
public Square() {
ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
vertexBuffer = byteBuf.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
}
public void draw(GL10 gl) {
// 定义前、后面对(GL_CW顺时针、GL_CCW逆时针)
gl.glFrontFace(GL10.GL_CW);
// 定义一个定点坐标数组
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
/*
* 启用客户端功能
*
* GL_COLOR_ARRAY 当glDrawArrays、glDrawElements被调用时,颜色数组可以被读写
*
* GL_NORMAL_ARRAY 当glDrawArrays、glDrawElements被调用时,普通数组可以被读写
*
* GL_TEXTURE_COORD_ARRAY 当glDrawArrays、glDrawElements被调用时,践理?酵可以被读写
*
* GL_VERTEX_ARRAY 当glDrawArrays、glDrawElements被调用时,矩阵数组可以被读写
*/
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// 从数组数据中渲染图元
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
// 禁用客户端功能
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
}