openGL——在Android中使用openGL来画一个三角形
package com.example.opengl1; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLSurfaceView; import android.opengl.GLU; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.util.AttributeSet; import android.view.Menu; /** * 以下这个demo实现了画一个红色的三角形 * @author pc * */ public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyGLSurfaceView view = new MyGLSurfaceView(this); //renderer: 渲染器.. view.setRenderer(new MyRenderer()); setContentView(view); } class MyGLSurfaceView extends GLSurfaceView{ public MyGLSurfaceView(Context context) { super(context); } public MyGLSurfaceView(Context context,AttributeSet attrs) { super(context, attrs); } } //自定义渲染器 class MyRenderer implements GLSurfaceView.Renderer{ //表层创建时 @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { //设置清屏色 gl.glClearColor(0, 0, 0, 1); //启用顶点缓冲区 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); } //表层size时 @Override public void onSurfaceChanged(GL10 gl, int width, int height) { //红色纸视口,输出画面的区域 gl.glViewport(0, 0, width, height); float ratio = (float)width/(float)height; //矩阵模式,投影矩阵,openGL基于状态机 gl.glMatrixMode(GL10.GL_PROJECTION); //加载单位矩阵 gl.glLoadIdentity(); //平截头体(最后一个f表示他是浮点数的类型) gl.glFrustumf(-1f, 1f, -ratio, ratio, 3, 7); } //绘图 @Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT);//清除颜色缓冲区 //模型视图矩阵 gl.glMatrixMode(gl.GL_MODELVIEW); gl.glLoadIdentity(); // eyeX, eyeY, eyeZ: 放置眼球的坐标 // centerX, centerY, centerZ,: 眼球的观察点.(在这里只要比5小就行了,如果大于5的话,就会看到的是黑屏) // upX, upY, upZ: 指定眼球向上的向量 // GLU.gluLookAt(gl, eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ) GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0,1,0); /** * 画三角形 * 绘制数组 * 三角形坐标 */ float[] coords = { 0f,0.5f,0f, -0.5f,-0.5f,0f, 0.5f,-0.5f,0f, }; //分配字节缓冲区控件,存放顶点坐标数据 ByteBuffer ibb = ByteBuffer.allocateDirect(coords.length * 4); ibb.order(ByteOrder.nativeOrder());//设置顺序(本地顺序) FloatBuffer fbb = ibb.asFloatBuffer();//放置顶点坐标数组 fbb.put(coords); ibb.position(0);//定位指针的位置,从该位置开始读取顶点数据 gl.glColor4f(1f, 0f, 0f, 1f);//设置绘图时的颜色 /** * 3: 3维坐标,使用3个坐标值表示一个点 * type: 每个点的数据类型 * stride: 0,跨度 * ibb: 指定定点缓冲区 */ gl.glVertexPointer(3, GL10.GL_FLOAT, 0, ibb); gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);//绘制三角形 } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。