• opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类


    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

  • 相关阅读:
    Educational Codeforces Round 56—C. Mishka and the Last Exam
    Educational Codeforces Round 56—B. Letters Rearranging
    Educational Codeforces Round 56—A. Dice Rolling
    【POJ2406】——Power Strings(KMP 最小循环节)
    【NOIP2010】——乌龟棋(简单dp)
    【洛谷P4149】【IOI2011】——Race(点分治)
    C++ STL 思维导图,脑图,树形图。
    关于 C/C++ 函数调用约定
    通过注册表强制解锁文件占用
    半自动二进制协议模糊工具 Peach 使用
  • 原文地址:https://www.cnblogs.com/bokeofzp/p/5881488.html
Copyright © 2020-2023  润新知