【问题标题】:Voxel game: rendering blocks different ways and perfomance体素游戏:渲染块的不同方式和性能
【发布时间】:2015-02-02 21:07:17
【问题描述】:

我正在使用 OpenGL 制作类似 Minecraft 的游戏,我想知道在不损失性能的情况下进行灵活渲染的最佳解决方案是什么。我的意思是有不同类型的块有不同的绘制方式:通常的块只是带有纹理的简单立方体,楼梯更复杂,像水和熔岩这样的液体块需要更新纹理。我有一个带有显示列表的块。每个块都有自己的类型(字节值)。根据这个值,我可以找到“完整”的块表示(所有相同类型的块都很常见,包含名称、绘制方法和附加信息)。现在我需要删除渲染不可见的面(如果块在左侧有邻居,我们不需要绘制它的左面)。但这意味着我需要将 6 个参数传递给绘图方法(或数组或掩码)。这是一种很好的绘图方式,还是我选择了一个愚蠢的解决方案?对于以自己的方式绘制不同类型的块,您有什么建议?

for(int x = 0; x < 16; x++){
        for(int y = 0; y < 128; y++){
            for(int z = 0; z < 16; z++){    
                GL11.glPushMatrix();
                    GL11.glTranslatef(x, y, z);
                    BlockTypes.getBlockType(blocks[x][y][z].type).draw();                   
                GL11.glPopMatrix();
            }
        }
    }       

【问题讨论】:

    标签: java opengl lwjgl voxel


    【解决方案1】:

    我建议为每个块和着色器使用 VBO,而不是显示列表和固定管道(实际上已弃用)。

    使用 VBO 具有多种优势。它允许您使用着色器,提供比固定管道更大的灵活性。使用着色器,您可以将纹理数据、颜色数据等与顶点/索引数据分开发送。同样,VBO 通常更快。

    VBO 提供更大灵活性的一种方式是使用水和熔岩,这需要纹理更新可以与缓冲分开调用,从而减少重新缓冲整个块的需要。

    至于隐形人脸检测,我相信这是唯一的方法。无需传递 6 个参数,只需将块传递给方法。您还可以创建一个方法来检索您正在检查的块周围的块。

    【讨论】:

    • 请不要使用建议,而是根据事实来回答
    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 2011-03-19
    • 2018-03-27
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多