Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL立方体顶点错误_Java_Opengl_Rendering_Lwjgl - Fatal编程技术网

Java OpenGL立方体顶点错误

Java OpenGL立方体顶点错误,java,opengl,rendering,lwjgl,Java,Opengl,Rendering,Lwjgl,一天多来,我一直在努力解决立方体顶点不正确的问题,但运气不好。我试过10种不同的顶点数组,但没有一种有效。问题是,我真的不明白有人是如何计算出数字的去向的,所以我不能亲自调试它 这是我目前的代码。我认为对于熟悉OpenGL的人来说,这是相对简单的,但是如果您有任何问题,请提问 编辑:现在的问题是纹理显示错误。已编辑代码和结果图片以反映此更改 private int amountOfVertices; private int vertexSize; private int textureSize;

一天多来,我一直在努力解决立方体顶点不正确的问题,但运气不好。我试过10种不同的顶点数组,但没有一种有效。问题是,我真的不明白有人是如何计算出数字的去向的,所以我不能亲自调试它

这是我目前的代码。我认为对于熟悉OpenGL的人来说,这是相对简单的,但是如果您有任何问题,请提问

编辑:现在的问题是纹理显示错误。已编辑代码和结果图片以反映此更改

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添加了第一个四边形的坐标。只要试着坚持点、线、线循环、线带、三角形、三角形带和扇形:(注意图中顶点的顺序!)