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

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

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

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

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

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

编辑:这并不意味着您需要为每个立方体的每个面的每个角都有单独的顶点.实际上,最简单的方法来渲染你想要的东西(当块在一起时),并且使用相当简单的实现可能是将前面和后面各自渲染为两个三角形,使用颜色纹理,GL_MAG_FILTER,GL_NEAREST采样和仔细对齐纹理坐标,使用像素着色器剪切透明纹素.

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

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

点赞