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 中正确创建的主要内容,如果未能解决你的问题,请参考以下文章