почему я получаю FloatBuffer не прямая ошибка? - PullRequest
2 голосов
/ 10 июля 2011

Я пытаюсь нарисовать объект из массива вершин. Метод для этого требует 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.

Ответы [ 3 ]

10 голосов
/ 09 августа 2012

Вы можете попробовать использовать BufferUtils.createFloatBuffer(int size). BufferUtils является частью LWJGL и предназначен для этой цели.

7 голосов
/ 10 июля 2011

Очевидно, потому что это не прямое.Вы можете выделить прямой FloatBuffer, создав ByteBuffer с allocateDirect , а затем получив его представление FloatBuffer с asFloatBuffer .

2 голосов
/ 18 января 2015

Этот вопрос довольно старый, поэтому я впечатлен, что он еще не был упомянут. Вам нужно перевернуть () буфер перед использованием его в glVertexPointer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...