VBO 没有在 LWJGL 中正确创建

Posted

技术标签:

【中文标题】VBO 没有在 LWJGL 中正确创建【英文标题】:VBO's are not created properly in LWJGL 【发布时间】:2014-05-17 03:38:37 【问题描述】:

我有一个使用顶点缓冲区对象设置的 2D 游戏,游戏中的每个“项目”都在游戏启动前在 for 循环中创建了自己的缓冲区。我发现前两个“硬币”物品(它们隐约看起来像硬币......)已成功创建,毫无疑问地显示了它们的纹理,但其他两个只是空白立方体......这让我相信我正在绑定顶点正确显示,因为它正在显示四边形,但纹理没有被正确缓冲。

这是我的生成代码:

 public void generateWorldLegacy() 

    for(Item item : world.items) 

        item.load();
                    //This makes the item class load its image 

         for(int i = 0; i < item.textureId.length; i++) 

             item.vboBuffer[i] = BufferUtils.createFloatBuffer(amountOfVertices * vertexSize);

             item.vboBuffer[i].rewind();

             item.vboBuffer[i].put(

                         new float[] 

                         - item.width/2, - item.height/2,
                         + item.width/2, - item.height/2,
                         + item.width/2, + item.height/2,
                         - item.width/2, + item.height/2

             );

             item.vboBuffer[i].flip();

                 //TODO I have to make these public, put all the floatbuffers into arrays so I can dispose of them when the process is terminated

                 item.textureBuffer[i] = BufferUtils.createFloatBuffer(amountOfVertices * textureSize);

                 item.textureBuffer[i].rewind();

                 item.textureBuffer[i].put(new float[] 

                            0, 1,
                            1, 1,
                            1, 0, 
                            0, 0

                 );

                 item.textureBuffer[i].flip();

                 item.vboId[i] = glGenBuffers();
                 glBindBuffer(GL_ARRAY_BUFFER, item.vboId[i]);
                 glBufferData(GL_ARRAY_BUFFER, item.vboBuffer[i], GL_STATIC_DRAW);
                 glBindBuffer(GL_ARRAY_BUFFER, 0);

                 item.textureId[i] = glGenBuffers();
                 glBindBuffer(GL_ARRAY_BUFFER, item.textureId[i]);
                 glBufferData(GL_ARRAY_BUFFER, item.textureBuffer[i],       GL_STATIC_DRAW);
                 glBindBuffer(GL_ARRAY_BUFFER, 0);

             System.out.println(item.textureId[i] + "\n");

         

    


这是我的渲染代码(用于项目):

    public void renderWorld() 

    glTranslatef(-player.position.x, -player.position.y, 0);

    for(Item i : world.items) 

        glTranslatef(i.position.x, i.position.y, 0);

        if(i.position.y - horizon < player.position.y)  

        glBindTexture(GL_TEXTURE_2D, i.vboId[i.spritePointer]);

        // vertices
        glBindBuffer(GL_ARRAY_BUFFER, i.vboId[i.spritePointer]);
        //glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW);
        glVertexPointer(vertexSize, GL_FLOAT, 0, 0);
        // texCoords
        glBindBuffer(GL_ARRAY_BUFFER, i.textureId[i.spritePointer]);
        //glBufferData(GL_ARRAY_BUFFER, textureData, GL_STATIC_DRAW);
        glTexCoordPointer(textureSize, GL_FLOAT, 0, 0);
        // unbind VBO

        glBindBuffer(GL_ARRAY_BUFFER, 0);

        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);

        glDrawArrays(GL_QUADS, 0, amountOfVertices);

        glDisableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);

        

        glTranslatef(-i.position.x, -i.position.y, 0);

    




如果我需要发布我的项目代码和“播放器”渲染代码,我会发布,但我认为这不是问题的原因。

这是我的结果图片:

https://www.dropbox.com/s/rvqopq2tmtmf8xd/Screen%20Shot%202014-05-16%20at%209.16.40%20PM.png

【问题讨论】:

我不熟悉LWJGL,但是glBufferData函数不应该多一个参数吗? void glBufferData(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage); @2am:Java OpenGL 绑定通常使用Buffer 对象来传递数据,而不是我们在 C 绑定中使用的大小/指针组合。 【参考方案1】:

您的对象 ID 混淆了。看看这两行代码:

glBindTexture(GL_TEXTURE_2D, i.vboId[i.spritePointer]);
glBindBuffer(GL_ARRAY_BUFFER, i.vboId[i.spritePointer]);

您使用相同的 id 来绑定纹理和缓冲区。

【讨论】:

以上是关于VBO 没有在 LWJGL 中正确创建的主要内容,如果未能解决你的问题,请参考以下文章

在不同系统上使用 VBO 进行 LWJGL 渲染

lwjgl 纹理多重绑定到一个 VBO

LWJGL Indexed VBO,很多混乱

lwjgl 通过 JSlider 更新 VBO(颜色、顶点)

OpenGL VBO 没有正确更新

使用 VBO 使用 LWJGL 对 3D 立方体进行纹理处理