首页 文章

将C OpenGL转换为Java / LWJGL

提问于
浏览
2

我正在阅读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 回答

  • 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

    由于它可能会将您不会使用的数据复制到分配的缓冲区中,因此会有轻微的性能损失 .

    你可以试试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);
    

相关问题