/**
 * 缓冲区工具类
 */
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. 在 Windows 7 Professional、Enterprise 或 Ultimate 上安装 IIS 7.5

    原文 在 Windows 7 Professional.Enterprise 或 Ultimate 上安装 IIS 7.5 应用到: Windows Server 2008 R2 默认情况下,Wind ...

  2. JSF+EJB+JPA总体思路

    前言: JSF+EJB+JPA 其实我并没有想象中的难,只是想做好,建立在正确的地方应用,真正的困难. 良好的技术,在错误的地方做应用,这是唯一能够被垃圾. 用. 重量级企业应用能够使用这个主要的3层 ...

  3. mac在查看jre通路

    于Finder于command+shift+G 选/Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home 版权声明:本文博主原创 ...

  4. AngularJS html5Mode与ASP.NET MVC路由共存

    前言 很久之前便听说AngularJS,非常酷,最近也比较火,我也在持续关注这个技术,只是没有认真投入学习.前不久公司找我们部门做一个OA系统(想省下几万大洋的费用),第一时间便想到AngularJS ...

  5. 【android】ImageView的src和background以及两者之间的神奇的差异

    一.ImageView中XML属性src和background的差别: background会依据ImageView组件给定的长宽进行拉伸.而src就存放的是原图的大小,不会进行拉伸.src是图片内容 ...

  6. java中的反射,invoke方法[转]

    在施老师的项目中需要用到invoke,就是通过函数名反射相应的函数.一下代码简单地介绍了java反射中invoke方法,如果要具体的,可以参考魔乐核心课程的反射部分内容 package org.cur ...

  7. jsmart 前结合案例

    前绑定jsmart这是一个不错的选择.之前通过经常使用的项目中的.最近涉及的领域的后端部.jsmart有些使用相对较少,主要是因为他想引用文件,我写的模板,在一个简单的项目,直接使用js界,很复杂的前 ...

  8. 阅读小记3(《C编程专家》)

    gets()不检查缓冲区空间.多余的字符将覆盖原来的栈的内容. fgets()的第二个參数说明最大读入的字符数. 假设这个參数值为n,那么fgets()就会读取最多n-1个字符或读完一个换行符为止.两 ...

  9. linux_inux中find批量删除空文件及空文件夹脚本

    1.{}和之间有一个空格 2.find . -name 之间也有空格 3.exec 是一个后续的命令,{}内的内容代表前面查找出来的文件 linux下批量删除空文件(大小等于0的文件)的方法 rm - ...

  10. SpringMVC1

    itRed You are never too old to set another goal or to dream a new dream. SpringMVC一路总结(一) SpringMVC听 ...