读书人

Android Opengles 学习1

发布时间: 2013-01-26 13:47:02 作者: rapoo

Android Opengles 学习一

最近项目中用到了libgdx 于是便抽空看了下opengles,关于安卓的资料也不多,不过opengles 各个平台的代码页都差不多,IOS的资料还是比较丰富的 ,网上找到最多的就是一个三角形旋转。

推荐一些学习opengl先要学的东西吧, 维基百科上很清楚

矩阵 这个非常重要 基本 opengl里面很多效果实现 都靠矩阵变化

opengl中的坐标 不同于 android 本身的坐标系 物体坐标 世界坐标

屏幕坐标映射到 世界坐标 涉及到一些算法 射线拾取 ,包围算法 等。。。

。。

先贴代码了

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.Renderer;import android.util.Log;public class OpenglLess1Render implements Renderer {protected float near=1;  protected float far=20;protected float ratio;float[] lines=new float[]{-1f,0f,0f, //顶点坐标1.0f,0f,0f,0f,1.0f,0f};@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {// TODO Auto-generated method stub// 对透视进行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);// 启用阴影平滑gl.glShadeModel(GL10.GL_SMOOTH);gl.glClearColor(0, 0, 0, 0);// 设置深度缓存gl.glClearDepthf(1.0f);// 启用深度测试gl.glEnable(GL10.GL_DEPTH_TEST);// 作为深度测试的类型gl.glDepthFunc(GL10.GL_LEQUAL);}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {// TODO Auto-generated method stubratio = (float) width / height;Log.e("lin","width="+width+" height="+height+" ratio="+ratio);// 设置OpenGl场景大小gl.glViewport(0, 0, width, height);// 设置矩阵投影gl.glMatrixMode(GL10.GL_PROJECTION);gl.glLoadIdentity();// 设置串口的大小   near,far视野的距离   假设眼睛在原点   往Z轴负方向看   超过视野距离则看不见  gl.glFrustumf(-ratio, ratio, -1, 1, near, far);// 选择模型观察矩阵gl.glMatrixMode(GL10.GL_MODELVIEW);gl.glLoadIdentity();}@Overridepublic void onDrawFrame(GL10 gl) {// TODO Auto-generated method stub//清楚颜色,深度缓存gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);//开启模型试图矩阵gl.glMatrixMode(GL10.GL_MODELVIEW);//加载一个基本矩阵 可以理解为重置矩阵,因为每次draw后 会保留原来的矩阵,如果不重置矩阵 ,在translate时 物体就会越离越远gl.glLoadIdentity();//眼睛设的视野距离为    -1,-20的坐标,则只有在该范围内 的物体才能看到    将物体移动到 z =-3处gl.glTranslatef(0, 0, -3f);//定义坐标点  数组  Specifies the number of coordinates per vertex. Must be 2, 3, or 4. The initial value is 4.gl.glVertexPointer(3, GL10.GL_FLOAT, 0,getFloatBuffer(lines));//启用定点数组   跟下面disable 相互对应  gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//设置画笔颜色gl.glColor4f(1.0F, 0F,0F,1.0F);//绘制三角形gl.glDrawArrays(GL10.GL_TRIANGLES, 0,3);gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);}/** * 分配内存空间    2.2 以前的版本冒失不需要这样实现  * 浮点变量 每个占4字节 * @param coords * @return */public FloatBuffer getFloatBuffer(float[] coords) {ByteBuffer vbb = ByteBuffer.allocateDirect(coords.length * 4);vbb.order(ByteOrder.nativeOrder());FloatBuffer mFVertexBuffer = vbb.asFloatBuffer();mFVertexBuffer.put(coords);mFVertexBuffer.position(0);return mFVertexBuffer;}}



读书人网 >Android

热点推荐