/**
 * 缓冲区工具类
 */
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 class MyScissorRenderer extends AbstractMyRenderer{

private int width ;
 private int height ;
 public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  //清平色
  gl.glClearColor(0f, 0f, 0f, 1f);
  //启用顶点缓冲区数组
  gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
 }
 
 public void onSurfaceChanged(GL10 gl, int width, int height) {
  this.width = width ;
  this.height = 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);
 }
 
 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.glEnable(GL10.GL_SCISSOR_TEST);
  
  //旋转角度
  gl.glRotatef(xrotate, 1, 0, 0);
  gl.glRotatef(yrotate, 0, 1, 0);
  
  float[] coords = {
   -ratio,1f,2f ,
   -ratio,-1f,2f ,
   ratio,1f,2f ,
   ratio,-1f,2f
  };
  
  //颜色数组
  float[][] colors = {
    {1f,0f,0f,1f},
    {0f,1f,0f,1f},
    {0f,0f,1f,1f},
    {1f,1f,0f,1f},
    {0f,1f,1f,1f},
    {1f,0f,1f,1f},
  };
  
  int step = 20 ;
  for(int i = 0 ; i < 6 ; i ++){
   //设置剪裁区
   gl.glScissor(i * 20, i * 20, width - (i * 20 * 2), height - (i * 20 * 2));
   //设置颜色
   gl.glColor4f(colors[i][0],colors[i][1],colors[i][2],colors[i][3]);
   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);

}

}

openGL剪裁区的更多相关文章

  1. opengl剪裁空间和视口空间中不遵从右手定则,而是遵从左手定则

    opengl剪裁空间和视口空间中不遵从右手定则,而是遵从左手定则. 比如说要在视口空间判断一个三角形是否是正面朝向用户,就需要用左手定则而非右手定则.

  2. OpenGL渲染流程

    一.什么是openGL OpenGL被定义为“图形硬件的一种软件接口”.从本质上说,它是一个3D图形和模型库,具有高度的可移植性,具有非常快的速度. 二.管线 管线这个术语描述了opengl渲染的整个 ...

  3. 深入理解OpenGL拾取模式(OpenGL Picking)

    深入理解OpenGL拾取模式(OpenGL Picking) 本文转自:http://blog.csdn.net/zhangci226/article/details/4749526 在用OpenGL ...

  4. TControl.GetDeviceContext会给图形控件建立新的坐标原点和建立新的剪裁区域

    这是取得DC句柄的其中一种方法(会重定义原点和建立新的剪裁区): function TControl.GetDeviceContext(var WindowHandle: HWnd): HDC; be ...

  5. OpenGL中的拾取模式( Picking)

    1. Opengl中的渲染模式有三种:(1)渲染模式,默认的模式:(2)选择模式, (3)反馈模式.如下 GLint glRenderMode(GLenum mode) mode可以选取以下三种模式之 ...

  6. 基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之Shader准备(7)

    Cocos2d-x底层图形绘制是使用OpenGL ES协议的.OpenGL ES是什么呢? OpenGL ES(OpenGl for Embedded System)是OpenGL三维图形API的子集 ...

  7. GDI编程

    图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出.GDI负责Wind ...

  8. GDI编程小结

    图形设备接口(GDI)是一个可运行程序,它接受Windows应用程序的画图请求(表现为GDI函数调用),并将它们传给对应的设备驱动程序,完毕特定于硬件的输出,象打印机输出和屏幕输出.GDI负责Wind ...

  9. VC++学习之GDI概述

    VC++学习之GDI概述 图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏 ...

随机推荐

  1. Simditor图片上传

    上一篇文章(Simditor用法)仅仅是简单的默认配置,我们可自己定义工具栏button使其更丰富和实现上传图片功能 初始化编辑器 <script type="text/javascr ...

  2. (大数据工程师学习路径)第一步 Linux 基础入门----基本概念及操作

    本节联练习主要有: 1.环境介绍 2.常用 Shell 命令及快捷键 3.Linux 使用小技巧 一.Linux 桌面环境介绍 相对于现在的 Windows 系统,UNIX/Linux 本身是没有图形 ...

  3. Testin一日游实验室发布的行级APP质量报告:在那里拍携程双赢

    Testin实验室公布国庆出行旅途类APP质量报告:携程力压去哪儿夺冠 2014/09/28 · Testin · 实验室报告 一年一度的十一黄金周即将临近,旅游软件成为每外出行人手机必装软件.为此全 ...

  4. Ubuntu 15.10 x64 安装 Android SDK(转)

    操作系统:Ubuntu 15.10 x64 目标:安装 Android SDK 本文最后更新时间:2015-11-3 安装32位库文件 2013年9月的iPhone 5s是第一款64位手机,而Andr ...

  5. iOS:删除小程序

    //Applet的批次从父视图中移除 NSArray *subViews = [_scrollView subviews]; if([subViews count] != 0) { [subViews ...

  6. 军医王-moTestin云测试看好移动医疗行业

    看医生汪谟军:Testin云測在移动医疗产业大有可为 2014/10/21 · Testin · 开发人员訪谈 日常生活可能常常碰到这种情况:突然遇上头疼脑热.小病小痛,去医院又不方便:非常想了解家人 ...

  7. 【日报C在23】堆和栈的深入了解

    每日一C之堆与栈的深入理解        每天拾一个C语言贝壳,厚积薄发,积跬步以致千里.  今日贝壳:内存中堆与栈的深入理解.认识一个清晰地内存                          假 ...

  8. Sierpinski三角形

    转载请标明地址:http://www.cnblogs.com/wangmengmeng/ 效果图: 通项公式:An=3的N-1次方 源代码: #include <graphics.h> # ...

  9. 浅谈JavaScript中的柯里化函数

    首先,不可避免的要引经据典啦,什么是柯里化函数呢(from baidu): 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返 ...

  10. 细说 ASP.NET Cache 及其高级用法【转】

    阅读目录 开始 Cache的基本用途 Cache的定义 Cache常见用法 Cache类的特点 缓存项的过期时间 缓存项的依赖关系 - 依赖其它缓存项 缓存项的依赖关系 - 文件依赖 缓存项的移除优先 ...