将2D位图转换为3D立方体模型的有效方法?

时间:2010-12-03 22:56:01

标签: c++ c opengl graphics 3d

我想在opengl中创建32x32位图的立方体模型。例如,给定一个来自超级马里奥的Bob-omb的2D位图,结果看起来应该是这样的:http://fc02.deviantart.net/fs49/f/2009/186/f/a/Bob_omb_in_Minecraft_by_Luafox.png这个想法是将位图中的每个2D像素表示为3D立方体。

每个模型都代表游戏中的敌人,所以我需要能够快速渲染这些模型。这样做的好方法是什么?

我做过的一个尝试是通过首先创建一个32x32x2的顶点网格,然后在适当的位置从这些顶点创建三角形来形成立方体面,从位图生成静态3D模型。我遇到的一个大问题是如何存储面部的颜色和法线。每个面的三角形需要共享一个顶点,共享顶点需要存储该面的颜色和法线。但是,我认为每个面都没有足够的顶点来获得适当的颜色和法线。我想不出一个优雅的方法来解决这个问题。

3 个答案:

答案 0 :(得分:2)

如果将正面渲染为单个纹理映射GL_QUAD,使用alpha和GL_ALPHA_TEST作为“透明”部分,则最快。然后,您将边界(即非正面方块)设为一个或多个GL_QUAD_STRIP。

如果您决定将精灵绘制为一系列实际立方体,例如,如果您想将精灵炸成单独的立方体,或者如果您在小立方体面上有非常详细的纹理,则创建一个显示列表对于一个立方体并重复调用该显示列表。

答案 1 :(得分:0)

关于存储面部的颜色和法线;我认为您必须接受需要为不同的面重复相同位置的顶点。如果两个顶点共享某些属性但在其他顶点上有所不同,则它们本质上是不同的 - 即使它们共享的一个属性是它们的位置。

因此,您应该构建一些VBO,并根据需要重复顶点。您可能希望将其作为设计时步骤运行,并将结果保存为方便的格式,以便在运行时保存一些工作。

编辑:这并不意味着您需要为每个多维数据集的每个面的每个角都有单独的顶点。实际上,以最简单的方式渲染你想要的东西(虽然块在一起)和一个相当简单的实现可能是将前面和后面每个渲染为两个三角形,使用颜色纹理,GL_MAG_FILTER, GL_NEAREST采样和小心纹理坐标的对齐,使用像素着色器剪切透明纹理像素。

然后,您需要做更多的工作(不一定是在运行时)来确定哪些面可以从侧面看到,并将每个面作为几何体(所有这些几何体都是单个静态VBO到显示,因此与例如调用-deprecated相比,减少了绘制调用的数量和几何成本,尽管通常仍然是有用的 - 每个多维数据集的显示列表。同样,小心谨慎,你可以确保它与正面和背面的不可见部分精确连接。

如果你这样做,那么你想让你的敌人爆炸并让组成的立方体分开,你就可以切换到一个更昂贵的版本来显示每一个立方体。

答案 2 :(得分:0)

只是暗示你如何找到一些有趣的读物:搜索“体素”。 http://en.wikipedia.org/wiki/Voxel

也许你想看看开源游戏引擎Cube / Sauerbraten的源代码,它们基于地图的立方体细分,并带有一个漂亮的游戏内编辑器: http://sauerbraten.org/