我正在渲染草,每个草有8个顶点(每个对象)。这使我的游戏从50+ FPS降到了31 FPS。

为了找到解决方案,我偶然发现了a Mipmapping tutorial,这是一种使纹理不太详细的方法。 “好极了”,我想!由于草只是两个带有纹理的平坦表面,因此看起来可以解决该问题!

草模型看起来像这样(很显然,我然后对其应用了纹理,并使用着色器使某些部分透明):



但是,启用mipmapping时,我获得了32 FPS-仅比不使用mipmapping多了1 FPS!
我在草地上还染了些蓝色?


没有进行贴图,草看起来像这样:


为什么我的Mipmapping没有给我任何形式的性能增强?考虑到我的草大部分只是质地,那么为什么不降低质地不会提高性能?

而且,为什么在草地上会产生蓝色调?这与mipmapping如何降低纹理分辨率有关吗?

我目前使用此代码生成:

texture = TextureLoader.getTexture("PNG",
                new FileInputStream("res/" + fileName + ".png"));
        GL30.glGenerateMipmap(GL11.GL_TEXTURE_2D);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR);
        GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0);


我使用以下代码实际渲染草:

public void render(){
    Main.TerrainDemo.shader.start();
    glPushMatrix();
    glTranslatef(location.x, location.y, location.z);
    TexturedModel texturedModel = TerrainDemo.texModel;
    RawModel model = texturedModel.getRawModel();
    GL30.glBindVertexArray(model.getVaoID());
    GL20.glEnableVertexAttribArray(0);
    GL20.glEnableVertexAttribArray(1);
    GL13.glActiveTexture(GL13.GL_TEXTURE0);
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, texturedModel.getTexture().getID());
    glScalef(10f, 10f, 10f);
    glDrawElements(GL_TRIANGLES, model.getVertexCount(), GL11.GL_UNSIGNED_INT, 0);
    GL20.glDisableVertexAttribArray(0);
    GL20.glDisableVertexAttribArray(1);
    GL30.glBindVertexArray(0);
    glPopMatrix();
    Main.TerrainDemo.shader.stop();
}

最佳答案

使用mip贴图可以修改纹理,但是草在纹理中实际上并不会做很多工作,因为它是一个很小的对象。

渲染草的大部分工作来自处理所有顶点,尤其是如果草有很多小对象时,则要处理这些对象。

您应该将草合并为一个网格,然后进行渲染。图形卡非常适合处理具有大量顶点的对象,而不适合于处理大量对象。

如果您使用的是jMonkeyEngine,我可能会推荐一些可以为您进行批处理的类(最明显的是BatchNode,尽管也有其他选择)。也许仍然值得关注一下jMonkeyEngine是如何实现想法的。

09-27 00:12