zoukankan      html  css  js  c++  java
  • openGL绘制正方形

    /**
     * 缓冲区工具类
     */
    public class BufferUtil {
     /**
      * 将浮点数组转换成字节缓冲区
      */
     public static ByteBuffer arr2ByteBuffer(float[] arr){
      ByteBuffer ibb = ByteBuffer.allocateDirect(arr.length * 4);
      ibb.order(ByteOrder.nativeOrder());
      FloatBuffer fbb = ibb.asFloatBuffer();
      fbb.put(arr);
      ibb.position(0);
      return ibb ;
     }
     
     /**
      * 将list转换成字节缓冲区
      */
     public static ByteBuffer list2ByteBuffer(List<Float> list){
      ByteBuffer ibb = ByteBuffer.allocateDirect(list.size() * 4);
      ibb.order(ByteOrder.nativeOrder());
      FloatBuffer fbb = ibb.asFloatBuffer();
      for(Float f : list){
       fbb.put(f);
      }
      ibb.position(0);
      return ibb ;
     }
    }

    /**  

    * 渲染器

     */

    public abstract class AbstractMyRenderer implements android.opengl.GLSurfaceView.Renderer

    {  

     private float ratio;  

      public float xrotate = 0f;//围绕x轴旋转角度

    public float yrotate = 0f;//围绕x轴旋转角度  

     /**

      * 1.

      */  

    public void onSurfaceCreated(GL10 gl, EGLConfig config)

    {  

     //清平色  

     gl.glClearColor(0f, 0f, 0f, 1f);   

    //启用顶点缓冲区数组

      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  

    }

    /**  

    * 2.

      */

     public void onSurfaceChanged(GL10 gl, int width, int height) {

    //设置视口

      gl.glViewport(0, 0, width, height);   

    ratio = (float)width / (float)height;   

    //投影矩阵  

     gl.glMatrixMode(GL10.GL_PROJECTION);

      //加载单位矩阵  

     gl.glLoadIdentity();  

     //设置平截头体   

    gl.glFrustumf(-ratio, ratio, -1, 1, 3f, 7f);  }

    /**

      * 3.

      */  

    public abstract void onDrawFrame(GL10 gl);

    }

    /**
     * 三角形带,正方形
     */
    public class MyTriangleRenderer extends AbstractMyRenderer{

    public void onDrawFrame(GL10 gl) {
      //清除颜色缓冲区
      gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
      //设置绘图颜色
      gl.glColor4f(1f, 0f, 0f, 1f);
      
      //操作模型视图矩阵
      gl.glMatrixMode(GL10.GL_MODELVIEW);
      gl.glLoadIdentity();
      //设置眼球的参数
      GLU.gluLookAt(gl,0f,0f,5f, 0f, 0f, 0f, 0f,1f,0f);
      
      //旋转角度
      gl.glRotatef(xrotate, 1, 0, 0);
      gl.glRotatef(yrotate, 0, 1, 0);

    //计算点坐标
      float r = 0.5f ;//半径
      float[] coords = {
       -r,r,0,
       -r,-r,0,
       r,r,0,
       r,-r,0,
      };
      //指定顶点指针
      gl.glVertexPointer(3, GL10.GL_FLOAT, 0, BufferUtil.arr2ByteBuffer(coords));
      gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
     }

    public class MainActivity extends Activity {

         private AbstractMyRenderer render;  

    private MyGLSurfaceView view;

     public void onCreate(Bundle savedInstanceState) {

     super.onCreate(savedInstanceState);
            view = new GLSurfaceView(this);
            render = new MyTriangleRenderer();
            view.setRenderer(render);
            //GLSurfaceView.RENDERMODE_CONTINUOUSLY:持续渲染(默认)
            //GLSurfaceView.RENDERMODE_WHEN_DIRTY:脏渲染,命令渲染
            view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
            setContentView(view);
        }

    public boolean onKeyDown(int keyCode, KeyEvent event) {

    float step = 5f ;
         //up
         if(keyCode == KeyEvent.KEYCODE_DPAD_UP){
          render.xrotate = render.xrotate - step ;
         }
         else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN){
          render.xrotate = render.xrotate + step ;
         }
         else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){
          render.yrotate = render.yrotate + step ;
         }
         else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
          render.yrotate = render.yrotate - step ;
         }
         //请求渲染,和脏渲染配合使用
         view.requestRender();
         return super.onKeyDown(keyCode, event);
        }
    }

  • 相关阅读:
    面向对象与类
    引用数据类型
    方法
    java for 语句的用法
    java 数组
    Scanner与Random
    java基本语法
    java介绍及安装。
    数据库设计
    NFS相关、NFS服务端安装配置、exportfs命令、nfs客户端的问题
  • 原文地址:https://www.cnblogs.com/danmao/p/3817312.html
Copyright © 2011-2022 走看看