实际上,我正在编写一个立方体网格,在这个超级方法中,我需要传递多维数据集顶点,这是一个float[],但是我想以一种“对人类友好的方式”来实现,所以我已经这样做了:
private static FloatBuffer vertices = MemoryUtil.memAllocFloat(72);
private static final float[] A={0,0,0},B={0,1,0},C={1,1,0},D={1,0,0},E={0,0,0},F={0,1,0},G={1,1,0},H={1,0,0}; //Vertices
public class MyClass extends MyMeshClass
{
public MyClass()
{
super(
vertices
//Front
.put(A).put(B).put(C).put(D)
//Back
.put(E).put(F).put(G).put(H)
//Right
.put(D).put(C).put(G).put(H)
//Left
.put(A).put(B).put(F).put(E)
//Top
.put(B).put(F).put(G).put(C)
//Bottom
.put(A).put(E).put(H).put(D).array(),
Doing other cool stuff here);
}
}但是,在转换为数组时,我最终得到了一个UnsupportedOperationException,所以我尝试通过将FloatBuffer转换成这样的数组,进行了不同的尝试
public static float[] toArray(FloatBuffer buffer)
{
float[] array = new float[buffer.limit()];
buffer.get(array);
return array;
}但是我在get (数组)上得到了一个BufferUnderflowException。
有人知道为什么它不起作用吗?
发布于 2020-09-09 18:06:21
根据javadoc for Buffer.array(),如果缓冲区没有可访问数组- https://docs.oracle.com/javase/8/docs/api/java/nio/Buffer.html#array--支持,UnsupportedOperationException将被抛出。
这种情况会发生,即当缓冲区使用不是在JVM堆中分配的数组,而是在本机内存中分配的数组时。由于LWJGL的MemoryUtil.memAllocFloat是为opengl优化的,因此我认为它利用了本地内存,因此在这种缓冲区上调用的array()方法失败了。
如果要在堆中分配缓冲区,只需使用:
FloatBuffer vertices = FloatBuffer.allocate(72);或
FloatBuffer vertices = FloatBuffer.wrap(new float[72]);
``发布于 2020-09-09 18:00:22
你试过像这样吗?
FloatBuffer buf = FloatBuffer.allocate(10);
buf.put(1f).put(2f).put(3f).put(new float[]{4,5,6});
System.out.println(Arrays.toString(buf.array()));打印
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 0.0, 0.0, 0.0, 0.0]https://stackoverflow.com/questions/63816698
复制相似问题