我正试图从一个顶点数组中绘制一个对象。此方法需要FloatBuffer
而不是数组。我从数组中创建一个浮点缓冲区,但是为什么我运行代码却出现错误。顺便说一句,所有必需的属性都已启用(openGL)。
码:
float vertices[] ={
-1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1,
1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, -1,
-1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1,
-1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1
};
FloatBuffer temp = FloatBuffer.allocate(vertices.length);
temp.put(vertices);
GL11.glVertexPointer(3, GL11.GL_FLOAT, temp);
错误:
java.lang.IllegalArgumentException: FloatBuffer is not direct
at org.lwjgl.BufferChecks.checkDirect(BufferChecks.java:139)
at org.lwjgl.opengl.GL11.glVertexPointer(GL11.java:2622)
at XLesson01.render(XLesson01.java:95)
at XLesson01.run(XLesson01.java:51)
at XLesson01.main(XLesson01.java:42)
新代码:
ByteBuffer temp = ByteBuffer.allocateDirect(vertices.length*8);
temp.order(ByteOrder.nativeOrder());
FloatBuffer buffer = temp.asFloatBuffer();
buffer.put(vertices);
GL11.glVertexPointer(3, GL11.GL_FLOAT, buffer);
新错误:
A fatal error has been detected by the Java Runtime Environment:
EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x69aa9410, pid=3524, tid=1032
JRE version: 6.0_22-b04# Java VM: Java HotSpot(TM) Client VM (17.1-b03 mixed mode, sharing windows-x86 )
Problematic frame:
C [nvoglv32.DLL+0x5a9410]
An error report file with more information is saved as:
E:\java\workspace4\opengltest\hs_err_pid3524.log
If you would like to submit a bug report, please visit:
http://java.sun.com/webapps/bugreport/crash.jsp
The crash happened outside the Java Virtual Machine in native code.
See problematic frame for where to report the bug.
最佳答案
显然是因为它不是直接的。您可以通过使用allocateDirect创建ByteBuffer,然后使用asFloatBuffer获取其FloatBuffer视图来分配直接的FloatBuffer。
关于java - 为什么我得到的FloatBuffer不是直接错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6637491/