【问题标题】:OpenGL cube vertices are wrongOpenGL立方体顶点是错误的
【发布时间】:2013-09-22 16:06:43
【问题描述】:

一整天以来,我一直在尝试解决我的立方体顶点不正确的问题,但运气不佳。我已经尝试了大约 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();
}

The output looks something like this

如果您需要更多信息,请告诉我,我一直在为此苦苦挣扎。我知道 GL_QUADS 已被弃用,但我真的很想运行它。

【问题讨论】:

  • 第二个 vertexData.put 有错字吗?
  • 哦,伙计,你是对的......我从来没有注意到这一点。谢谢。当我解决这个问题时,结合格里米所说的,它使整个事情变得更像方形。

标签: java opengl rendering lwjgl


【解决方案1】:

您正在使用GL_QUADS 进行绘图,因此您的几何图形必须定义四边形。

这不是四边形。第三个坐标交叉回到 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_QUADS 在较新的 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

【讨论】:

  • 我的问题是我不完全了解顶点是如何设置的,这就是我复制和粘贴的原因。但是,既然您向我展示了这一点,那就更有意义了。我最终将所有 2 移到最后,它现在就像一个立方体。但是,纹理被拉伸并且不正确。 It looks like this.。有什么想法吗?
  • 您可能必须对纹理坐标数据进行相同的修改。
  • 那没有做到。现在它在 0,0 0,1 1,1 1,0
  • 为第一个四边形添加了坐标。
  • 这篇文章很好地总结了opengl原语。试着坚持点、线、线环、线带、三角形、三角形带和扇形:math.hws.edu/graphicsnotes/c3/s2.html(注意图中顶点的顺序!)
猜你喜欢
  • 1970-01-01
  • 2018-11-24
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
相关资源
最近更新 更多