我正在阅读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
一切看起来都很简单,我绕过 FloatBuffer
使用 float[]
的数组,这还不是那么重要,但我想知道我可以让这种技术起作用 .
然而有一点让我担心,那就是我无法将 (ByteBuffer)null
作为第二个参数传递给 glBufferData
,因为LWJGL当时得到 NPE
.
所以我决定分配一个没有元素的缓冲区,这仍然遵循将 NULL
放入那里的C语言吗?关于此Java版本与C版本是否有任何性能问题?
2 回答
你可以填充你传入的缓冲区,这样你就不需要映射:
由于它可能会将您不会使用的数据复制到分配的缓冲区中,因此会有轻微的性能损失 .
你可以试试LWJGL的
glBufferData(int target, long data_size, int usage)
它应该是C等价的glBufferData(GL_ARRAY_BUFFER, 12 * 4, NULL, GL_STATIC_DRAW);
像这样: