当前位置:操作系统 > 安卓/Android >>

Android Opengles 学习一

     最近项目中用到了libgdx   于是便抽空看了下opengles,关于安卓的资料也不多,不过opengles 各个平台的代码页都差不多,IOS的资料还是比较丰富的 ,网上找到最多的就是一个三角形旋转。
 
     推荐一些学习opengl先要学的东西吧,  易做图上很清楚 
 
矩阵  这个非常重要  基本  opengl里面很多效果实现 都靠矩阵变化
 
opengl中的坐标   不同于 android 本身的坐标系     物体坐标  世界坐标   
 
屏幕坐标映射到  世界坐标     涉及到一些算法     射线拾取 ,包围算法 等。。。
 
。。
 
     先贴代码了
 
 
[java]
public class OpenglLess1Activity extends Activity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        // TODO Auto-generated method stub   
        super.onCreate(savedInstanceState);  
          
        GLSu易做图ceView view = new GLSu易做图ceView(this);  
        view.setRenderer(new OpenglLess1Render());  
        setContentView(view);  
    }  
}  
 
public class OpenglLess1Activity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
 
        GLSu易做图ceView view = new GLSu易做图ceView(this);
        view.setRenderer(new OpenglLess1Render());
        setContentView(view);
}
}
 
 
 
 
[java] view plaincopyprint?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.GLSu易做图ceView.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};  
      
    @Override  
    public void onSu易做图ceCreated(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);  
    }  
  
    @Override  
    public void onSu易做图ceChanged(GL10 gl, int width, int height) {  
        // TODO Auto-generated method stub   
  
        ratio = (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();  
    }  
  
    @Override  
    public 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 以前的版本冒失不需要这样实现  
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,