我正在尝试在XNA 4.0中编写一个自定义的Minecraft Classic多人游戏客户端,但是当我真正在游戏中绘制世界时,我感到非常难过.每个块都是3D空间中的立方体,并且它可以在每一侧具有不同的纹理.我一直在互联网上阅读,发现对于一个立方体,每一面都有不同的纹理,每个面都需要自己的一组顶点.这使得每个立方体总共有24个顶点,如果你有一个由64*64*64立方体组成的世界(或者可能更多!),那就会产生很多顶点.
在我的原始代码中,我将纹理贴图分成单独的纹理,并在绘制每个立方体的每一面之前应用这些纹理贴图.我被告知这是一种非常昂贵的方法,我应该将纹理保存在同一个文件中,只需使用UV坐标将某些子纹理映射到立方体上.尽管如此,这对性能没有太大作用,因为顶点的数量太多了.我还被告知要在VertexBuffer中收集顶点并立即绘制它们,但这也没有多大帮助,并且当顶点数量超过缓冲区的最大大小时偶尔会导致异常.我尝试制作立方体共享顶点的任何尝试也都失败了,导致大量减速和毛刺的立方体.
我不知道该怎么做.我一般都非常擅长编程,但任何类型的3D编程或游戏开发都完全逃脱了我.
这是我用来绘制立方体的方法.我有两个全局列表List<VertexPositionTexture>以及List<int>,一个用于顶点和一个指数.绘图时,我遍历世界上的所有立方体,并对非空的立方体(如Air)进行RenderShape.我拥有的形状类粘贴在下面.AddVertices方法中的注释代码是尝试使多维数据集共享顶点.当所有立方体的顶点都已添加到列表中时,数据将粘贴到VertexBuffer和IndexBuffer中,并调用DrawIndexedPrimitives.
说实话,我可能完全错了,但我真的不知道该怎么做,并且没有教程实际描述如何绘制大量对象,只有非常简单的对象.我不得不弄清楚如何重做BasicShape以获得多个纹理.
您可以采取很多措施来加快速度:
您想要做的是将立方体区域烘焙到顶点缓冲区中。我的意思是,将一小块区域中的所有立方体放入一个顶点缓冲区中。仅当多维数据集发生更改时才更新此缓冲区。
在像《我的世界》这样的世界中,很多面孔都相互遮挡。您能做的最重要的事情就是隐藏两个立方体之间共享的面。想象一下两个立方体并排放置,你实际上不需要在中间画出脸,因为无论如何它都看不见。在我们的引擎中,这导致顶点数减少了 20 倍。
_ _ _ _
|_|_| == |_ _|
Run Code Online (Sandbox Code Playgroud)
至于你的纹理,正如你所说,使用纹理图集是一个好主意。这大大减少了绘制调用。
祝你好运!如果您想作弊,请查看Infiniminer。Infiniminer 是《我的世界》的基础游戏。它是用 XNA 编写的并且是开源的!
| 归档时间: |
|
| 查看次数: |
6058 次 |
| 最近记录: |