【发布时间】:2014-03-12 09:43:32
【问题描述】:
首先,我对 3D 编程和 libgdx 还是很陌生。
我看了一些教程,我已经渲染了我想要的场景。我有一些 1x1x1 块,用ModelBuilder.createRect() 为每个可见面创建,所以如果另一个块覆盖这个块的一个面,则没有为这个块创建矩形。也不需要顶部和底部矩形,因为我永远看不到它们(除了地板)。所以我想,这非常有效。我也启用了Backface culling,我启用了Viewfrustum culling。但是,如果我朝一个方向看,我的视锥中有很多块,FPS 会下降到 15-20。这对我来说还是可以的,因为我的笔记本电脑已经 5 年多了,性能不是最好的,但this answer 让我思考。
“模型构建器仅用于调试”。好的,但是我应该如何创建我的盒子?为什么我应该在建模应用程序(如 Blender)中为简单的正方形创建 Model?通过这样做,我什至无法剔除被其他块占据的面。
所以我的问题是:
如何以最有效的方式创建和渲染这些框?
【问题讨论】:
-
IIRC,您的方法会导致每个矩形都进行一次绘制调用,如果您有很多矩形,这将变得非常昂贵。查看 DecalBatch 了解您在做什么。它可以将所有矩形组合成一个绘图调用。
-
但是
ModelBatchflush()不是只有在缓冲区满的时候才发送给GPU的,所以只发送到GPU一次。还有DecalBatch,据我所知,sdoes not do what I need,它在3D空间中绘制了一个2DTexture,不是吗? -
哦,是的,没错。你在使用混合吗?你画了多少个矩形? DecalBatch 可以绘制没有纹理的实心矩形......你只需要一个自定义 GroupStrategy 来设置它。这个家伙 (badlogicgames.com/forum/…) 发现 DecalBatch 和 ModelBuilder 对矩形有相似的性能。
-
我使用混合,实际上我有一个 100*100 的方块地图,有 4 个方块高的墙壁。我在 z 方向上只有边缘墙 + 1 个墙穿过整个地图,内部有 1 个洞(要穿过)。所以大约有 1000 个矩形(最多,取决于我的位置和方向导致平截头体剔除)。所有的矩形都有一个 128*128 像素的纹理。我想将它们分组,但当时我无法重复
Textures(请参阅我的另一个问题(stackoverflow.com/questions/21908241/…)) -
我不知道是什么导致了你的低帧率,除了可能是过度过度绘制(你可以通过不使用混合来测试)。所以这可能无济于事,但我使用 DecalBatch 做了类似的事情。 DecalBatch 在 3D 空间中绘制矩形,这几乎就是您使用 ModelBatch 所做的。但我认为你可以将贴花子类化,这样你就可以手动调整 UV 以避免不得不将每面墙最多绘制四次。相反,使用具有可重复纹理的单个贴花,并将两个顶部顶点处的 V 设置为您想要的任何高度(1、2、3 或 4)。
标签: java performance 3d libgdx culling