Преобразование C ++ OpenGL в Java / LWJGL

Я следую за книгой OpenGL SuperBible: шестое издание, и там они работают с C ++, однако я предпочитаю программировать на Java, я неплохо справляюсь с отображением всех функций, LWJGL, в конце концов, довольно прост, однако теперь у меня есть некоторые опасения.

Учитывая следующий код в C ++:

GLuint buffer;  //buffer id
glGenBuffers(1, &buffer);   //generate an unique id
glBindBuffer(GL_ARRAY_BUFFER, buffer);  //bind buffer
glBufferData(GL_ARRAY_BUFFER, 12 * 4, NULL, GL_STATIC_DRAW);    //allocate data on GPU
void *ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);    //obtain memory pointer on GPU
memcpy(ptr, data, sizeof(data));    //copy data, which is an array of float[]
glUnmapBuffer(GL_ARRAY_BUFFER); //done with copying

Я сделал этот код Java:

    abId = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, abId);
glBufferData(GL_ARRAY_BUFFER, ByteBuffer.allocateDirect(12).asFloatBuffer(), GL_STATIC_DRAW);

FloatBuffer data;   //declares FloatBuffer object
data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY, 12 * 4, null).asFloatBuffer();   //gets FloatBuffer to which we can write, allocate 12 floats * 4 [float length]
data.put(0.25f).put(-0.25f).put(0.5f).put(1.0f)
.put(-0.25f).put(-0.25f).put(0.5f).put(1.0f)
.put(0.25f).put(0.25f).put(0.5f).put(1.0f); //put data, NOT backed by array
glUnmapBuffer(GL_ARRAY_BUFFER); //unmap the buffer

Все кажется довольно простым, я обхожу, используя массив float[] посредством FloatBuffer, это не так важно, но я хотел знать, что я могу заставить эту технику работать.

тем не мение один дело в том, что я не могу пройти (ByteBuffer)null в качестве второго аргумента в glBufferData, как LWJGL получает NPE затем.
Итак, я решил выделить буфер без элементов, это все еще следует за идиомой C ++ NULL туда? Есть ли какие-либо проблемы с производительностью относительно этой версии Java по сравнению с версией C ++?

2

Решение

Это приведет к небольшому снижению производительности, так как, скорее всего, скопирует данные, которые вы не будете использовать в выделенный буфер.

Вы можете попробовать LWJGL glBufferData(int target, long data_size, int usage) это должен быть эквивалент C glBufferData(GL_ARRAY_BUFFER, 12 * 4, NULL, GL_STATIC_DRAW);

Как это:

glBufferData(GL_ARRAY_BUFFER, 12 * 4, GL_STATIC_DRAW);
2

Другие решения

Вы можете заполнить буфер, который вы передаете, так что вам не нужно отображать:

abId = glGenBuffers();
FloatBuffer data = ByteBuffer.allocateDirect(12).asFloatBuffer();   //allocates FloatBuffer object
data.put(0.25f).put(-0.25f).put(0.5f).put(1.0f)
.put(-0.25f).put(-0.25f).put(0.5f).put(1.0f)
.put(0.25f).put(0.25f).put(0.5f).put(1.0f);
data.flip();
glBindBuffer(GL_ARRAY_BUFFER, abId);
glBufferData(GL_ARRAY_BUFFER, data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
0

По вопросам рекламы [email protected]