OpenGL 是一个非常底层的画图接口,它所使用的缓冲区存储结构是和我们的 java 程序中不相同的。
Java 是大端字节序(BigEdian),而 OpenGL 所需要的数据是小端字节序(LittleEdian)。所以,我们在将 Java 的缓冲区转化为 OpenGL 可用的缓冲区时需要作一些工作。
就ok了,但是为什么java.lang.IllegalArgumentException: Must use a native order direct Buffer这个错误会在android1.6以上出现,在1.5上不会出现。
- 最好创建一个工具类:
- package vanilla.utils;
- import java.nio.ByteBuffer;
- import java.nio.ByteOrder;
- import java.nio.FloatBuffer;
- public class BufferUtil {
- public static FloatBuffer floatBuffer;
- public static FloatBuffer fBuffer(float[]a)
- {
- //先初始化buffer,数组的长度*4,因为一个float占4个字节
- ByteBuffer mbb=ByteBuffer.allocateDirect(a.length*4);
- //数组排列用nativeOrder
- mbb.order(ByteOrder.nativeOrder());
- floatBuffer=mbb.asFloatBuffer();
- floatBuffer.put(a);
- floatBuffer.position(0);
- return floatBuffer;
- }
- }
- 然后在在onSurfaceCreated里面构建这个Buffer
- verticeBuffer = BufferUtil.fBuffer(vertices);
- vertices 是:
- private float[] vertices = new float[] {
- 0.f, -0.525731f, 0.850651f,
- 0.850651f, 0.f, 0.525731f,
- 0.850651f, 0.f, -0.525731f,
- -0.850651f, 0.f, -0.525731f,
- -0.850651f, 0.f,0.525731f,
- -0.525731f, 0.850651f, 0.f,
- 0.525731f, 0.850651f, 0.f,
- 0.525731f, -0.850651f, 0.f,
- -0.525731f, -0.850651f, 0.f,
- 0.f,-0.525731f, -0.850651f,
- 0.f, 0.525731f, -0.850651f,
- 0.f, 0.525731f, 0.850651f };
转贴:http://blog.csdn.net/zhangyadick18/article/details/6343103