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;}}