大型、缓慢旋转的行星图形用于游戏。

5
为了开发一款电脑游戏,我想要绘制旋转缓慢的非常大(~500像素)行星图形。这些图形旨在给人留下深刻印象。那么最好的方法是什么呢?
  • 我可以预先渲染每一帧,但是对于每个行星而言,在500像素和10秒的旋转周期内,这将产生荒谬的数据量。
  • 我可以使用3D引擎,并将行星的纹理映射到逼近球体的网格上,但是在500像素的情况下,我担心多边形数量需要很大才能使其看起来不错。
  • 我可以编写一种自定义的3D引擎,只需有效地渲染带纹理的球体即可,通过将每个视图像素的x / y坐标转换为球体纹理的坐标空间 - 但这很复杂,并且无法从图形加速中受益。
  • 还有其他我没有想到的方法吗?

这里是一个动画GIF示例,展示了我的意思。 (100x100像素和60帧已经相当巨大,抱歉。)想象一下这个图像更大,旋转得更慢,动画更平滑:

alt text

但是如果这是500x500像素和10 x 25 = 250帧,我们将谈论数百MB的数据,因此这种简单的方法行不通。


这可能更适合发布在http://gamedev.stackexchange.com/上。 - Jon
7个回答

6

Fracplanet可以保存“球贴图”纹理贴图(和凹凸贴图);请参见画廊底部的图片。这些旨在随后读入应用程序并映射到相对低分辨率的球形几何体上,以实现我认为您正在寻找的效果。这种方法将使用比预渲染动画方法或使用原始全分辨率多边形模型更少的内存。

是的,基本上这是您的第二个要点,但我不会那么快地排除这种方法,我想您会发现您可以使用比您预期的更低分辨率的球体;眼睛更容易注意到纹理中的细节,而不是它所覆盖的几何体的低分辨率。现代曲面细分硬件意味着您可能可以轻松让GPU为您生成和渲染大量的球形多边形。

另一个想法:渲染一个足够大的单个正方形四边形以覆盖行星。对于其中的每个像素,执行像素着色器,计算屏幕光线球体交点(如果有)。从行星纹理中查找颜色(考虑时间和行星旋转)。避免了许多多边形的需求,并得到了一个精确的球体。


在你最后一段中,难道不能使用高度图技术来使其呈现球形外观吗? - Zan Lynx

2
如果你想要图形加速,那么多边形是比较便宜的 -- 一个相当大数量的多边形不是问题。我建议使用立方体贴图和相应的类立方体三角形网格:从原点开始用立方体表面的顶点网格,并将每个3D坐标归一化为单位半径。这将使计算纹理坐标变得容易。请记住需要为你的纹理选择正确的投影方式:在上述情况下,你需要为每个立方体面选择一个切线投影来匹配你的网格。

2
传统的方法是预先创建一个球体的图像,但不是将表面纹理的颜色存储在每个像素中,而是将纹理UV作为查找表进行存储。现在,您可以通过绘制预渲染图像来渲染球体,但从图像中找到的UV会在行星表面纹理中查找相应的纹素。为了使行星旋转,您可以向查找表图像中找到的UV坐标添加偏移量。确保使用模数加法,以便纹理平滑包裹。如果您想在行星上添加阴影,则可以将其作为纹理之上的单独通道添加。
对于没有内置图形加速的硬件,这种方法很可能比带有纹理多边形版本要快得多,并且您还可以使用尽可能多的多边形进行渲染,因为渲染是一个预处理过程。

1
如果你选择预渲染,那么如何使用一种算法,在游戏运行时根据玩家实际可能看到的情况来渲染所需的帧数 - 从'确定性'逐渐降低到越来越不可能的情况,基于游戏引擎在x秒后玩家可能处于哪个位置以及哪个帧应该在此时处于视野中,一直到'不可能'因此不进行渲染呢?

+1 我不确定它是否完全回答了问题,但我真的很喜欢像这样预测可能性的想法... - Basic
嗯,听起来OP已经掌握了他的基本策略 - 我建议一种方法使它们在可能无法工作时可行。为了详细说明这一点,当需要时,后台渲染所需的时间将被增加,因为您不能让引擎停止。以概率方式执行可以简化不必要的工作,但仍然必须确保您也完成了必要的工作。 - Tom W

1
如果你的星球始终沿着屏幕正交旋转,只需使用一个行进并被圆形遮罩掉的星球纹理即可。
如果您想要任意旋转轴,您需要问自己哪个更容易,3D解决方案还是使用一些压缩纹理来保存所有帧。如果您已经有一个易于使用的3D流水线,请使用它。
如果您制作一个256x256的帧,则可以将16个帧放在1024纹理上,因此60个帧只需要4个纹理。使用DXT3压缩,您可以期望每个纹理约为1 MB(相当合理)。

2
但是不同纬度的地球肯定会以不同的速度滚动,对吗? - Zarkonnen
另外,考虑到我想要旋转周期大约为10秒,那就需要在500x500的分辨率下拍摄250帧左右,或者大约220 MB未压缩数据... - Zarkonnen

0

你可以将相机移动到物体周围(如果所有的东西都是居中的,这个方法才有效),或者对物体进行变换。后者是常见的做法。

我建议看一下 sf.net/projects/a3d 这个项目,它很容易学习。draw_asteroids 使用了 glRotate 调用,这就是它。

此外,如果我听正确了的话,Doom3 引擎引入了贝塞尔曲线,这样游戏中的圆角(或者应用于这种情况的球体)就不需要由量化点组成(产生你所想象的丑陋网格网络)。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接