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
