我一直在尝试解决我的立方体纹理顶点不正确的问题,现在没有太多运气。纹理显示错误,并且每个方面都有所不同。
这是我目前的代码。我认为对熟悉OpenGL的人来说相对简单,但是如果你有任何问题请问。
上次我在几天前发布这篇文章时,我被投票并没有回答;如果我没有给你足够的信息或做错事,请告诉我。
private boolean hasBeenRendered = false;
private int amountOfVertices;
private int vertexSize;
private int textureSize;
private int vboVertexHandle;
private int vboTextureHandle;
private boolean canDraw = false;
public Block(BlockType type, Location loc) {
this.type = type;
this.loc = loc;
initRendering();
}
private void initRendering() {
amountOfVertices = 24;
vertexSize = 3;
textureSize = 2;
FloatBuffer vertexData = BufferUtils.createFloatBuffer(amountOfVertices * vertexSize);
float[] vertices = {
// X Y Z R G B
// face 0:
1.0f, 1.0f, 1.0f, // vertex 0
- 1.0f, 1.0f, 1.0f, // vertex 1
- 1.0f, - 1.0f, 1.0f, // vertex 3
1.0f, - 1.0f, 1.0f, // vertex 2
// face 1:
1.0f, 1.0f, 1.0f, // vertex 0
1.0f, - 1.0f, 1.0f, // vertex 1
1.0f, - 1.0f, - 1.0f, // vertex 3
1.0f, 1.0f, - 1.0f, // vertex 2
// face 2:
1.0f, 1.0f, 1.0f, // vertex 0
1.0f, 1.0f, - 1.0f, // vertex 1
- 1.0f, 1.0f, - 1.0f, // vertex 3
- 1.0f, 1.0f, 1.0f, // vertex 2
// face 3:
1.0f, 1.0f, - 1.0f, // vertex 0
1.0f, - 1.0f, - 1.0f, // vertex 1
- 1.0f, - 1.0f, - 1.0f, // vertex 3
- 1.0f, 1.0f, - 1.0f, // vertex 2
// face 4:
- 1.0f, 1.0f, 1.0f, // vertex 0
- 1.0f, 1.0f, - 1.0f, // vertex 1
- 1.0f, - 1.0f, - 1.0f, // vertex 3
- 1.0f, - 1.0f, 1.0f, // vertex 2
// face 5:
1.0f, - 1.0f, 1.0f, // vertex 0
- 1.0f, - 1.0f, 1.0f, // vertex 1
- 1.0f, - 1.0f, - 1.0f, // vertex 3
1.0f, - 1.0f, - 1.0f, // vertex 2
// 6 faces with 4 vertices with 6 components (floats)
};
vertexData.put(vertices);
vertexData.flip();
FloatBuffer textureData = BufferUtils.createFloatBuffer(amountOfVertices * textureSize);
textureData.put(new float[] {
1, 1, 0, 1, 0, 0, 1, 0,
1, 1, 0, 1, 0, 0, 1, 0,
1, 1, 0, 1, 0, 0, 1, 0,
1, 1, 0, 1, 0, 0, 1, 0,
1, 1, 0, 1, 0, 0, 1, 0,
1, 1, 0, 1, 0, 0, 1, 0,
});
textureData.flip();
vboVertexHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
vboTextureHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboTextureHandle);
glBufferData(GL_ARRAY_BUFFER, textureData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
@Override
public void render() {
// if(! hasBeenRendered) {
canDraw = true;
glPushMatrix();
{
glTranslatef(loc.getX(), loc.getY(), loc.getZ());
//glRotatef(x, 1, 1, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
//glBindTexture(GL_TEXTURE, type.getTexture().getTextureID());
glBindTexture(GL_TEXTURE_2D, type.getTexture().getTextureID());
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
glVertexPointer(vertexSize, GL_FLOAT, 0, 0L);
glBindTexture(GL_ARRAY_BUFFER, vboTextureHandle);
glTexCoordPointer(textureSize, GL_FLOAT, 0, 0L);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_QUADS, 0, amountOfVertices);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
}
glPopMatrix();
//hasBeenRendered = true; }
}
The output looks something like this。
如果您需要更多信息,请告诉我,我一直在努力解决这个问题。我知道GL_QUADS已被弃用,但我真的很想让它运行起来。
答案 0 :(得分:0)
你能提供你使用/目标的OpenGL吗?在GL 1.1中,一切都是可选的(如VBO),但在较旧的(即更新版本)版本中,许多内容都发生了变化,因此您可以使用glVertexAttribPointer交换glVertexPointer / glTexCoordPointer。 让我们假设你使用旧的OpenGL,然后删除VBO并用直接指针检查它。
也尝试自己指定索引,即使它们是直接的,但创建列表并使用glDrawElements手动指定它会更好。
Java并不真正喜欢原生的东西,所以你需要为OpenGL使用适当的缓冲区格式,否则它可能会弄乱看起来像你得到的结果的数据。
vertexData.put(vertices);
vertexData.order(ByteOrder.nativeOrder());
vertexData.flip();
除了这些之外,您需要将其分解为更小的部分,例如只绘制一个Quad并查看结果,因为它可能会影响您如何布置顶点/ UV数据。