opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法

android OpenGL ES的书中使用了下面代码:

1)创建三个顶点

private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{

0,one,0,

      -one,-one,0,

one,-one,0,

});

2)然后使用triggerBuffer 画顶点

例如:gl.glVertexPointer(3, GL10.GL_FIXED, 0,triggerBuffer );

经常会出现:Must use a native order direct Buffer的错误。

/* 
     * OpenGL 是一个非常底层的画图接口,它所使用的缓冲区存储结构是和我们的 java 程序中不相同的。 
     * Java 是大端字节序(BigEdian),而 OpenGL 所需要的数据是小端字节序(LittleEdian)。 
     * 所以,我们在将 Java 的缓冲区转化为 OpenGL 可用的缓冲区时需要作一些工作。建立buff的方法如下 
     * */

为了解决这个问题我们可以创建一个工具类:

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;

/**
 * Created by lenovo on 2016/9/6.
 */
public class BufferUtil {

    public static FloatBuffer floatToBuffer(float[] a) {
        //先初始化buffer,数组的长度*4,因为一个float占4个字节
        ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);
        //数组排序用nativeOrder,根据本地的排列顺序,指定存储方式,是1. Little endian(小头):将低序字节存储在起始地址
       // 2. Big endian(大头):将高序字节存储在起始地址
        mbb.order(ByteOrder.nativeOrder());
        FloatBuffer mBuffer = mbb.asFloatBuffer();
        mBuffer.put(a);
        mBuffer.position(0);
        return mBuffer;
    }
    // 将数组a转化为intbuffer
    public static IntBuffer intToBuffer(int[] a) {
        //先初始化buffer,数组的长度*4,因为一个float占4个字节
        ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);
        //数组排序用nativeOrder
        mbb.order(ByteOrder.nativeOrder());
        IntBuffer mBuffer2 = mbb.asIntBuffer();
        mBuffer2.put(a);
        mBuffer2.position(0);
        return mBuffer2;
    }
//创建一个长度为length的Floatbuffer,存储方式为opengl的存储方式,在每次调用put加入点后position都会加1,因此加入点后在绘图时候将position重置为0
    public static FloatBuffer getFloatBuffer(int length)
    {
        ByteBuffer mbb = ByteBuffer.allocateDirect(length * 4);
        mbb.order(ByteOrder.nativeOrder());
        FloatBuffer   mBuffer = mbb.asFloatBuffer();
        mBuffer.position(0);
        return mBuffer;
    }

    public static IntBuffer getIntBuffer(int length)
    {
        ByteBuffer mbb = ByteBuffer.allocateDirect(length * 4);
        mbb.order(ByteOrder.nativeOrder());
        IntBuffer   mBuffer = mbb.asIntBuffer();
        mBuffer.position(0);
        return mBuffer;
    }

}

PS:创建一个长度为length的Floatbuffer时候,存储方式为opengl的存储方式,在每次调用put加入点后position都会加1,因此加入点后在绘图时候将position重置为0

时间: 2024-12-17 01:01:09

opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法的相关文章

java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方法

java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方法 只需把这三个commons-pool.jar.commons-dbcp-1.2.2.jar和commons-collections-3.2.jar包加入到lib里即可解决.这三个包在你本地的tomcat下的lib里,直接buildpath导入就行了,不过有时导包不一定好使,是因为工程lib下的包跟tomcat下的包重复了,导致异常错误如: o

SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法

最近angularjs post到后台 400一头雾水 没有任何错误. 最后发现好文,感谢作者 SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法 今天开发过程中,在SpringMVC中的Action中处理前台ajax请求传过来的json数据直接转成对应的实体类时出错:400 Bad Request,后台也不报错,400指的的是请求无效(请求有语法问题或者不能满足请求),调试了好长时间

Android笔记——Android中数据的存储方式(二)

我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效率.如果学过JavaWeb的朋友,首先可能想到的是数据库.当然了数据库是一个方案,那么是否还有其他的解决方案呢?今天我们在讲下Android笔记——Android中数据的存储方式(一) 提到的除了SharedPreferences和Files(文本文件)以外的其他几种数据储存方式:xml文件.SQL

Java高性能编程之CAS与ABA及解决方法

Java高性能编程之CAS与ABA及解决方法 前言 如果喜欢暗色调的界面或者想换换界面,可以看看我在个人博客发布的 Java高性能编程之CAS与ABA及解决方法. CAS概念 CAS,全称Compare And Swap,比较与交换. 属于硬件级别的同步原语,从处理器层面提供了内存操作的原子性. 从概念上,我们可以得出三点.第一,CAS的运作方式(通过比较与交换实现).第二,硬件层面支持,性能肯定不低(当然它也不是银弹).第三,提供原子性,那么它的功能肯定是确保原子性,从而确保线程安全. 实际使

.NET中TextBox控件设置ReadOnly=true后台取不到值三种解决方法

.NET中TextBox控件设置ReadOnly=true后台取不到值三种解决方法 当TextBox设置了ReadOnly=true后要是在前台为控件添加了值,后台是取不到的,值为空,多么郁闷的一个问题经过尝试,发现可以通过如下的方式解决这个问题.感兴趣的朋友可以了解下 当TextBox设置了ReadOnly="true" 后,要是在前台为控件添加了值,后台是取不到的,值为“空” 原理没想通,说不清楚微软是出于什么考虑的,不过有时是要我们能通过前台脚本来填充值,并不希望用户修改其控件内

python中引入包的时候报错AttributeError: module 'sys' has no attribute 'setdefaultencoding'解决方法?

python中引入包的时候报错:import unittestimport smtplibimport timeimport osimport sysimp.reload(sys)sys.setdefaultencoding('utf-8') AttributeError: module 'sys' has no attribute 'setdefaultencoding'解决方法: 1.python2中解决方法:reload(sys)sys.setdefaultencoding('utf-8'

ios开发中,A valid provisioning profile for this executable was not found,的解决方法

手头上的一个ios项目在上架后,再进行时出现了以上的这个错误,这是上架后忘了对一些配置进行复原 我的项目解决方法是: 是上面的这一块出现了问题,图片上的配置是正常的情况,但是上架的时候对其进行了修改,改成公司的名称,所以一直在报那个错误. ios开发中,A valid provisioning profile for this executable was not found,的解决方法

解决jquery中动态新增的元素节点无法触发事件的问题有两种解决方法

解决jquery中动态新增的元素节点无法触发事件的问题有两种解决方法,如下: 为了达到更好的演示效果,假设在某个页面的body下有以下结构的代码: ? 1 2 3 4 5 6 7 8 9 10 11 <p id="pLabel">新加一条</p> <ul id="ulLabel">  <li class="liLabel">aaa1</li>  <li class="li

java.lang.UnsatisfiedLinkError: Couldn&#39;t load BaiduMapSDK 的解决方法

遇到找不到so的同学们可以先从以下几个方面来检查问题: 1.so的名字是不是被修改了?我们SDK的so名字是固定的,如果您自行对它进行了重命名操作,那肯定是没法找到so的.2.so放置位置不对.so需要放在libs/armeabi这个文件夹下,请检查一下.3.CPU架构问题.目前我们的SDK还不支持x86的CPU,所以如果您的模拟器或真机采用的x86架构,这样就没法使用我们的SDK了.4.还是CPU架构问题.虽然我们现在支持的是ARM的CPU,但是对于一些特殊的设备,so需要放置在libs/ar