Ошибка размера Java FloatBuffer OpenGL - PullRequest
0 голосов
/ 03 марта 2012

работа с реализацией OpenGL в LWJGL и попытка работы с функциями освещения.Это требует создания FloatBuffers для передачи в OpenGL.Ниже приведен соответствующий код:

GL11.glClearColor(0,0,0,0);

float[] ambientLight={(float).3,(float).5,(float).8,1};
FloatBuffer ambientLightB = FloatBuffer.allocate(4);
ambientLightB.put(ambientLight);

float[] diffuseLight={(float).25,(float).25,(float).25,1};
FloatBuffer diffuseLightB = FloatBuffer.allocate(4);
diffuseLightB.put(diffuseLight);

float[] lightPosition={0,0,1,1};
FloatBuffer lightPositionB = FloatBuffer.allocate(4);
lightPositionB.put(lightPosition);

float[] matAmbient={1,1,1,1};
FloatBuffer matAmbientB = FloatBuffer.allocate(4);
matAmbientB.put(matAmbient);

float[] matDiff={1,1,1,1};
FloatBuffer matDiffB = FloatBuffer.allocate(4);
matDiffB.put(matDiff);

GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glFrontFace(GL11.GL_CCW);
GL11.glEnable(GL11.GL_LIGHTING);

GL11.glMaterial(GL11.GL_FRONT,GL11.GL_AMBIENT,matAmbientB);
GL11.glMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE,matDiffB);
GL11.glLight(GL11.GL_LIGHT0,GL11.GL_AMBIENT,ambientLightB);
GL11.glLight(GL11.GL_LIGHT0,GL11.GL_DIFFUSE,diffuseLightB);
GL11.glLight(GL11.GL_LIGHT0,GL11.GL_POSITION,lightPositionB);
GL11.glEnable(GL11.GL_LIGHT0);

Первый вызов, который я выполняю в glMaterial, приводит к следующей ошибке:

Исключение в потоке "main" java.lang.IllegalArgumentException: Количество оставшихся элементов буфера равно 0, должно быть не менее 4. Поскольку может быть возвращено не более 4 элементов, необходим буфер с не менее 4-мя элементами, независимо от фактического числа возвращаемых элементов

Кажется, не совсем понятно, что я делаю неправильнобыть проблемой при создании FloatBuffer.

Ответы [ 3 ]

1 голос
/ 03 марта 2012

Для решения проблемы потребовался другой вызов функции, специфичный для LWJGL (BufferUtils.createFloatBuffer), а также метод flip ().Следующее правильно инициализировал буфер

float[] matAmbient={1,1,1,1};
FloatBuffer matAmbientB = BufferUtils.createFloatBuffer(4);
matAmbientB.put(matAmbient);
matAmbientB.flip();
1 голос
/ 03 марта 2012

Переверните () буфер после put () или используйте FloatBuffer.wrap (), что также сэкономит вам несколько строк кода.Или может потребоваться еще 4 слота, поэтому выделите 8 элементов.

0 голосов
/ 05 марта 2012

Идея использования FloatBuffers с LWJGL заключается в том, чтобы нативный код мог напрямую использовать там буферы, для правильной работы они должны использоваться следующим образом:

//Create a directly allocated buffer in bytes (16 = 4 Floats * size of float in bytes)
ByteBuffer bytes = ByteBuffer.allocateDirect(16).order(ByteOrder.nativeOrder());
FloatBuffer fb = bytes.asFloatBuffer();
fb.put(...);
fb.rewind(); //Moves the internal buffer pointer back to the start for the next thing to read from it

ByteOrder.nativeOrder () гарантирует, что независимо от того, использует ли ваша система порядковый или большой порядок байтов, она будет правильно перенесена из Java в собственный код. (См. http://en.wikipedia.org/wiki/Endianness)

Утилита LWJGL, скорее всего, сделает это за вас

...