0

我必须在 Irrlicht 中渲染大量的彩色广告牌,但这真的很慢。我使用了许多 BillboardSceneNodes:

List<BillboardSceneNode> voxels = new List<BillboardSceneNode>();
        for (int x = 0; x < 32; x++)
            for (int y = 0; y < 32; y++)
                for (int z = 0; z < 32; z++)
                {
                    Color c = new Color(r.Next(255), r.Next(255), r.Next(255));
                    BillboardSceneNode b = device.SceneManager.AddBillboardSceneNode(null, new Dimension2Df(1), new Vector3Df(x, y, z), -1, c);
                    b.SetMaterialFlag(MaterialFlag.Lighting, false);
                    voxels.Add(b);
                }

我该如何优化呢?我如何使用广告牌进行遮挡剔除或截锥剔除?

4

1 回答 1

2

每个渲染调用都有一个设置和拆除成本,您在每个广告牌之间支付这个费用,这将花费您在数百个广告牌之后的大量时间。如果您的许多广告牌共享相同的纹理和材质,那么您可以将它们分组到同一个表面并在一次调用中渲染它们,就像粒子系统场景节点所做的那样,如果您这样做,那么您将获得几个数量级的改进(数万而不是数百)并将瓶颈转移到将顶点上传到视频卡所花费的时间。

如果您需要 100k+ 广告牌,那么您可以进一步优化它,而不是将每个广告牌中每个三角形的每个边和顶点发送到每帧的卡片,您可以发送一个位置列表,并使用特定于您的视频的着色器来渲染它们司机。如果您这样做,您将失去 Irrlicht 的一些细节,例如软件驱动程序支持。

如果这还不够好并且您需要投入数百万,那么您需要将所有工作卸载到 GPU 并决定顶点着色器中的位置。这在您的用例中可能是不可能的,但如果您能做到,那么您只会受到显卡计算能力的限制。

于 2013-06-06T10:40:26.587 回答