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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM