当前位置: 首页 > 知识库问答 >
问题:

使用单个VBO创建体素块-如何翻译每个块的坐标并将其添加到VBO块?

周承天
2023-03-14

我正在尝试制作一个类似于minecraft的opengl体素引擎。

我创建了一个块类,我想把整个块的所有顶点放在一个VBO中。我以前只把每个块放入vbo,并调用渲染每个块。

当我将所有顶点放入一个vbo中时,我对如何转换块中每个块的坐标感到有点困惑。

这是我目前所拥有的:

public void drawChunk() {
        GL11.glPushMatrix();
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOVertexHandle);
        GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L);

        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOTextureHandle);
        GL11.glColorPointer(3, GL11.GL_FLOAT, 0, 0L);


        GL11.glDrawArrays(GL11.GL_QUADS, 0, 24);
        GL11.glPopMatrix();
}

public void putVertices(float tx, float ty, float tz) {
    float l_length = 1.0f;
    float l_height = 1.0f;
    float l_width = 1.0f;
    vertexPositionData.put(new float[]{
            xOffset + l_length + tx, l_height + ty, zOffset + -l_width + tz,
            xOffset + -l_length + tx, l_height + ty, zOffset + -l_width + tz,
            xOffset + -l_length + tx, l_height + ty, zOffset + l_width + tz,
            xOffset + l_length + tx, l_height + ty, zOffset + l_width + tz,

            xOffset + l_length + tx, -l_height + ty, zOffset + l_width + tz,
            xOffset + -l_length + tx, -l_height + ty, zOffset + l_width + tz,
            xOffset + -l_length + tx, -l_height + ty, zOffset + -l_width + tz,
            xOffset + l_length + tx, -l_height + ty, zOffset + -l_width + tz,

            xOffset + l_length + tx, l_height + ty, zOffset + l_width + tz,
            xOffset + -l_length + tx, l_height + ty,zOffset +  l_width + tz,
            xOffset + -l_length + tx, -l_height + ty,zOffset +  l_width + tz,
            xOffset + l_length + tx, -l_height + ty, zOffset + l_width + tz,

            xOffset + l_length + tx, -l_height + ty, zOffset + -l_width + tz,
            xOffset + -l_length + tx, -l_height + ty,zOffset +  -l_width + tz,
            xOffset + -l_length + tx, l_height + ty, zOffset + -l_width + tz,
            xOffset + l_length + tx, l_height + ty, zOffset + -l_width + tz,

            xOffset + -l_length + tx, l_height + ty, zOffset + l_width + tz,
            xOffset + -l_length + tx, l_height + ty, zOffset + -l_width + tz,
            xOffset + -l_length + tx, -l_height + ty, zOffset + -l_width + tz,
            xOffset + -l_length + tx, -l_height + ty,zOffset +  l_width + tz,

            xOffset + l_length + tx, l_height + ty,zOffset +  -l_width + tz,
            xOffset + l_length + tx, l_height + ty, zOffset + l_width + tz,
            xOffset + l_length + tx, -l_height + ty, zOffset + l_width + tz,
            xOffset + l_length + tx, -l_height + ty, zOffset + -l_width + tz

    });
}

public void createChunk() {
    vertexPositionData = BufferUtils.createFloatBuffer((24*3)*activateBlocks);

    Random random = new Random();
    for (int x = 0; x < CHUNK_SIZE; x++) {
        for (int y = 0; y < CHUNK_SIZE; y++) {
            for (int z = 0; z < CHUNK_SIZE; z++) {
                if(blocks[x][y][z].getActive()) {
                    putVertices(x, y, z);
                }
            }
        }
    }

    vertexPositionData.flip();

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOVertexHandle);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertexPositionData,
            GL15.GL_STATIC_DRAW);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);


    float[] cubeColorArray = new float[(24*3)*activateBlocks];
    for(int i=0; i<(24*3)*activateBlocks; i++) {
        cubeColorArray[i] = random.nextFloat();
    }
    FloatBuffer vertexTextureData = BufferUtils.createFloatBuffer((24*3)*activateBlocks);
    vertexTextureData.put(cubeColorArray);
    vertexTextureData.flip();

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOTextureHandle);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertexTextureData,
            GL15.GL_STATIC_DRAW);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);

    glEnd();
}

有什么简单的方法可以将每个块的顶点转换到正确的位置?我以前在每次调用渲染块时都使用glTranslatef,但现在不行了。我现在所做的也不起作用,所有的块都以堆叠的形式呈现在彼此的顶部,看起来如下所示:

编辑:我的vbo似乎只渲染一个块,而不是整个块。我不明白为什么会这样。

共有1个答案

狄卓君
2023-03-14

我已经解决了这个问题。问题出在我的方法上。

        GL11.glDrawArrays(GL11.GL_QUADS, 0, 24);

被改为:

        GL11.glDrawArrays(GL11.GL_QUADS, 0, 24*activateBlocks);
 类似资料:
  • 我的渲染方法目前看起来像这样: 我最近刚刚尝试使用VBO,在我直接发送顶点数据之前,一切工作正常,纹理映射正确。现在我用VBO改变了顶点数组,即使它有效,也没有应用纹理,我只能看到黑色的物体。 我的纹理可能有什么问题 为什么当我更改GLVertexAttribute指针(顶点,3,GL_FLOAT,GL_ FALSE,0,0)时;带glBindBuffer的行顺序(GL_ARRAY_BUFFER,

  • 我正在开发一个体素引擎,我正在使用VBO。我的问题是我不知道如何生成顶点。 我需要为一个块生成顶点,所以从X,Y,Z坐标创建一个立方体块(带有一个VBO)。 我该怎么做?

  • 我正在制作一个小的2D引擎/游戏来学习OpenGL(使用OpenGL330内核),我正在尝试抽象掉大多数OpenGL函数调用。 现在,我正试图找出如何最好地处理文本渲染。我有一个字体图集工作,但我不知道如何处理文本的顶点。现在,我有一个类,它有一个

  • 目前,我有一个类的集合,其中包含一个纹理、一个VAO和一个VBO。由于所有的状态切换和使用少量三角形调用,绘制数千个这样的对象会导致性能下降。 因此,现在我将更改我的实现,以便创建一系列1MIB VBO(从一个开始,一旦它满了,创建第二个1MIB VBO并继续填充它)。每个VBO需要单独的VAO吗?VBO已经使用了交错的顶点数据,所以我不是在谈论使用多个VBO来处理顶点、法线、纹理库等。

  • 目前,我有一个OBJ加载程序,可以加载必要的OBJ,解析材质,并在必要时绑定纹理。 但是,我需要澄清,当顶点指针在刚刚绑定的VBO中移动时,是否可以绑定多个纹理。我的意思是:我想在一个VBO中跨不同网格放置多个材质。研究告诉我需要使用着色器,但没有指定如何在VBO中间加载它们。 我试图尽量减少绘制调用和VBOs的数量,同时(希望)尽可能远离多纹理。任何帮助都非常感谢! 当前绘图代码:

  • 问题内容: 我正在寻求了解VBO的帮助。我已经做了大量研究,并找到了关于该主题的教程,但是它们对我来说仍然很模糊。我有几个问题: 一个VBO应该在哪里创建,我应该如何创建一个? 我目前正在使用下面的代码初始化我的顶点和索引缓冲区: 如果我是正确的话,这不是在创建VBO。因此,如果我想制作一个VBO,创建VBO的代码会紧接在上面列出的代码之后吗?如果是这样,它将如何创建? 另外,如何将VBO渲染并绘