【发布时间】:2011-01-15 20:00:56
【问题描述】:
我正在尝试在 XNA 4.0 中编写一个自定义的 Minecraft Classic 多人游戏客户端,但在实际绘制游戏中的世界时我完全被难住了。每个块都是 3D 空间中的一个立方体,它的每一面都可能有不同的纹理。我一直在互联网上阅读,发现对于一个立方体的每一面都有不同的纹理,每个面都需要自己的一组顶点。每个立方体总共有 24 个顶点,如果你有一个由 64*64*64 立方体(甚至可能更多!)组成的世界,那么就会产生很多顶点。
在我的原始代码中,我将我拥有的纹理贴图拆分为单独的纹理,并在绘制每个立方体的每一侧之前应用这些纹理。有人告诉我这是一种非常昂贵的方法,我应该将纹理保存在同一个文件中,并简单地使用 UV 坐标将某些子纹理映射到立方体上。不过,这对性能并没有多大帮助,因为顶点的数量实在是太多了。我还被告知要在 VertexBuffer 中收集顶点并一次绘制它们,但这也没有太大帮助,并且当顶点数超过缓冲区的最大大小时偶尔会导致异常。我尝试让立方体共享顶点的任何尝试也都失败了,导致速度大幅下降和立方体出现故障。
我不知道该怎么办。总的来说,我很擅长编程,但任何类型的 3D 编程或游戏开发都完全让我无法理解。
这是我用来绘制立方体的方法。我有两个全局列表List<VertexPositionTexture> 和List<int>,一个用于顶点,一个用于索引。绘制时,我会遍历世界上所有的立方体,并对那些不为空的立方体(如 Air)进行 RenderShape。我的形状类粘贴在下面。 AddVertices 方法中的注释代码是尝试使多维数据集共享顶点。当所有立方体的顶点都添加到列表中时,数据被粘贴到 VertexBuffer 和 IndexBuffer 中,并调用 DrawIndexedPrimitives。
说实话,我可能完全做错了,但我真的不知道该怎么做,也没有教程真正描述如何绘制大量对象,只有非常简单的。我必须弄清楚如何重做 BasicShape 才能自己拥有多个纹理。
【问题讨论】:
-
请问您想出了什么解决方案?我也对此感兴趣。
-
@HuseyinUslu - 抱歉,我从来没有真正得出结论。我尝试了一大堆东西,但从来没有让它正常工作。修复它的最佳方法是使用八叉树,但我很难弄清楚如何以有利于渲染的方式实现它们。希望对您有所帮助。