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

android中OpenGl初步(平面三角形,正方形)

2016-11-17 13:30 288 查看
效果图:

                             


1.绘图类

/**
* Created by LH on 2016/11/16.
*/

public class OpenGLRender implements GLSurfaceView.Renderer {
private float[] mTriangleArray = {
0f,1f,0f,
-1f,-1f,0f,
1f,-1f,0f
};
private FloatBuffer mTriangleBuffer;
private float[] mColorArray={
1f,0f,0f,1f,     //红
0f,1f,0f,1f,     //绿
0f,0f,1f,1f      //蓝
};
private FloatBuffer mColorBuffer;
//正方形的四个顶点
private FloatBuffer quateBuffer ;
private float[] mQuateArray = {
-1f, -1f, 0f,
1f, -1f, 0f,
-1f, 1f, 0f,
1f, 1f, 0f,
};
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 启用阴影平滑
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);
// 启用颜色数组
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
// 把三角形顶点转化成缓冲对象
mTriangleBuffer = BufferUtil.floatToBuffer(mTriangleArray);
// 把颜色转化成缓冲对象
mColorBuffer = BufferUtil.floatToBuffer(mColorArray);
// 把正方形顶点转化成缓冲对象
quateBuffer = BufferUtil.floatToBuffer(mQuateArray);
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// 设置视口
gl.glViewport(0, 0, width, height);
// 宽高比
float ratio = (float) width / (float) (height == 0 ? 1 : height);
// 设置当前矩阵堆栈为投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
// 对投影矩阵的任何改变都清除掉
gl.glLoadIdentity();
// 实现Surface和坐标系之间的映射关系
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
}

@Override
public void onDrawFrame(GL10 gl) {
// 清除颜色缓冲
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
// 对模型视景矩阵操作
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 对模型视景矩阵的任何改变都清除掉
gl.glLoadIdentity();
// 使用数组作为颜色
gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer);
// 绘制小三角形
gl.glLoadIdentity();
// x轴平移-1.5 z轴平移-6.0(向里)
gl.glTranslatef(-1.5f, 0.0f, -6.0f);
// y轴扩大2倍
gl.glScalef (1.0f, 2.0f, 1.0f);
// 表示模型沿着(0,0,1)这个轴旋转10°
gl.glRotatef(10.0f, -1.5f, 0.0f, -6.0f);
// 设置顶点。第一个参数为顶点包含的数据长度。第二个参数为单位
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);
// 绘制。第一个参数绘制模式,第二个从缓存中哪一位开始绘制,第三个顶点的数量
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
// 结束绘制
gl.glFinish();
// 绘制正方形
gl.glLoadIdentity();
gl.glTranslatef(1.5f, 0.0f, -6.0f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, quateBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glFinish();
}
}
2.获取缓冲对象工具类

/**
* Created by LH on 2016/11/16.
*/

public class BufferUtil {
public static FloatBuffer floatToBuffer(float[] a){
FloatBuffer mBuffer;
//先初始化buffer,数组的长度*4,因为一个float占4个字节
ByteBuffer mbb = ByteBuffer.allocateDirect(a.length*4);
//数组排序用nativeOrder
mbb.order(ByteOrder.nativeOrder());
mBuffer = mbb.asFloatBuffer();
mBuffer.put(a);
mBuffer.position(0);
return mBuffer;
}

public static IntBuffer intToBuffer(int[] a){
IntBuffer intBuffer;
//先初始化buffer,数组的长度*4,因为一个float占4个字节
ByteBuffer mbb = ByteBuffer.allocateDirect(a.length*4);
//数组排序用nativeOrder
mbb.order(ByteOrder.nativeOrder());
intBuffer = mbb.asIntBuffer();
intBuffer.put(a);
intBuffer.position(0);
return intBuffer;
}
}
3.调用方法

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
GLSurfaceView glSurfaceView=new GLSurfaceView(this);
glSurfaceView.setRenderer(new OpenGLRender());
setContentView(glSurfaceView);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: