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