Я следую за книгой 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 ++?
Это приведет к небольшому снижению производительности, так как, скорее всего, скопирует данные, которые вы не будете использовать в выделенный буфер.
Вы можете попробовать 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);
Вы можете заполнить буфер, который вы передаете, так что вам не нужно отображать:
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);