Java OpenGL立方体顶点错误
一天多来,我一直在努力解决立方体顶点不正确的问题,但运气不好。我试过10种不同的顶点数组,但没有一种有效。问题是,我真的不明白有人是如何计算出数字的去向的,所以我不能亲自调试它 这是我目前的代码。我认为对于熟悉OpenGL的人来说,这是相对简单的,但是如果您有任何问题,请提问 编辑:现在的问题是纹理显示错误。已编辑代码和结果图片以反映此更改Java OpenGL立方体顶点错误,java,opengl,rendering,lwjgl,Java,Opengl,Rendering,Lwjgl,一天多来,我一直在努力解决立方体顶点不正确的问题,但运气不好。我试过10种不同的顶点数组,但没有一种有效。问题是,我真的不明白有人是如何计算出数字的去向的,所以我不能亲自调试它 这是我目前的代码。我认为对于熟悉OpenGL的人来说,这是相对简单的,但是如果您有任何问题,请提问 编辑:现在的问题是纹理显示错误。已编辑代码和结果图片以反映此更改 private int amountOfVertices; private int vertexSize; private int textureSize;
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)
};
System.out.println(vertices.length);
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){
if(amt == 0){
amt = 1;
}else if(!canDraw){
return;
}
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();
}
如果你需要更多的信息,请告诉我,我一直在努力解决这个问题。我知道GL_四边形不受欢迎,但我真的很想让它运行。您正在使用
GL_四边形绘制,因此您的几何体必须定义四边形
这不是一个正方形。第三个坐标交叉回到x=1.0,沿对角线分割四边形。你需要按逆时针的顺序做一个四边形
// 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 2
-1.0f, -1.0f, 1.0f, // vertex 3
如果交换顶点2和顶点3,则该侧将有一个四边形
我想你可能是在用三角形条复制示例?但说真的。。拿一支铅笔和一些纸,画出来,自己动手做几何图形。这比从网络上复制随机顶点数组要快得多。如果顺序错误(逆时针),请首先禁用面剔除
请注意,GL\u四边形
在较新的opengl版本中被弃用。首选三角形或三角形条
纹理坐标:
- 0.0,0.0是左下角
- 1.0,1.0是右上角
然后,第一个四边形的纹理坐标将为:
1.0, 1.0
0.0, 1.0
0.0, 0.0
1.0, 0.0
你在第二个顶点有打字错误吗?放?哦,伙计,你说得对。。。我从来没有注意到。谢谢当我修复它时,结合Grimmy所说的,它使整个东西更像正方形。我的问题是我不完全理解顶点是如何设置的,这就是为什么我要复制和粘贴。然而,既然你向我展示了这一点,它就更有意义了。我把所有的2移动到了最后,现在它就像一个立方体。但是,纹理已拉伸且不正确。有什么想法吗?你可能必须在纹理坐标数据中做同样的修改。但那没有做到。现在它在0,0,1,1,1,0添加了第一个四边形的坐标。只要试着坚持点、线、线循环、线带、三角形、三角形带和扇形:(注意图中顶点的顺序!)