Graphics 大型、缓慢旋转的行星图案,适合游戏

Graphics 大型、缓慢旋转的行星图案,适合游戏,graphics,3d,Graphics,3d,对于我正在开发的一款电脑游戏,我想画一幅非常大(~500像素)的行星缓慢旋转的图形。这些图形是为了给人留下深刻印象。最好的方法是什么 我可以预渲染每一帧,但在500像素和10秒的旋转周期下,每个行星的数据量都是荒谬的 我可以使用3D引擎将行星的纹理映射到一个接近球体的网格上,但在500像素的情况下,我担心多边形数必须非常大才能使它看起来好看 我可以编写一种定制的3D引擎,通过将每个视图像素的x/y坐标转换为球体纹理的坐标空间,它除了高效地渲染纹理球体外,什么都不做——但这涉及到,并且不能从图形

对于我正在开发的一款电脑游戏,我想画一幅非常大(~500像素)的行星缓慢旋转的图形。这些图形是为了给人留下深刻印象。最好的方法是什么

  • 我可以预渲染每一帧,但在500像素和10秒的旋转周期下,每个行星的数据量都是荒谬的
  • 我可以使用3D引擎将行星的纹理映射到一个接近球体的网格上,但在500像素的情况下,我担心多边形数必须非常大才能使它看起来好看
  • 我可以编写一种定制的3D引擎,通过将每个视图像素的x/y坐标转换为球体纹理的坐标空间,它除了高效地渲染纹理球体外,什么都不做——但这涉及到,并且不能从图形加速中受益
  • 还有什么我没想到的
这里有一个例子来说明我的意思。(在100x100像素和60帧的情况下,它已经相当大了,对不起。)想象一下这个更大、更慢、更平滑的旋转:


但是如果这是500x500 px,10 x 25=250帧,我们将讨论数百MB的数据,因此这种简单的方法不起作用。

如果你进行预渲染,那么在游戏运行时使用一种算法来渲染所需的帧如何,基于玩家实际看到它们的可能性-从“确定”到越来越不可能,基于游戏引擎允许玩家在x秒时间内出现的位置,以及当时应该看到的帧,降低到“不可能”,因此无法渲染?

您可以围绕对象移动摄影机(只有在所有内容都居中时才有效),也可以变换对象。后者通常是这样做的

我可以推荐看sf.net/projects/a3d,它很容易学习<代码>绘制小行星使用
glRotate
调用,就这样


此外,如果我没听错的话,Doom3引擎引入了贝塞尔线,这样游戏中的圆角——或者说球体,应用到这个例子中——就不需要由量化点组成(产生你正在考虑的丑陋的网格网络).

如果你的行星总是垂直于屏幕旋转,那么你只要有一个滚动的行星纹理,并被一个圆圈遮住即可

如果你想要一个任意的旋转轴,你会问自己哪一个更容易,3D解决方案还是使用一对压缩纹理来保存所有的帧。如果您已经有一个易于使用的3D管道,请使用它


如果你制作一个256x256帧,你可以在1024个纹理上放置16个,这样60帧只需要4个纹理。使用DXT3压缩,每个纹理大约1 MB(非常合理)。

如果您想要图形加速,那么多边形是便宜的——相当多的多边形不是问题

我建议使用立方体贴图纹理和相应的类似立方体的三角形网格:从原点周围立方体(曲面)形状的顶点网格开始,然后将每个三维坐标规格化为单位半径。这将使计算纹理坐标变得容易

请记住,您需要为纹理选择正确的投影:在上述情况下,您需要每个立方体面的切线投影,以匹配网格。

可以保存“spheremap”纹理贴图(和凹凸贴图);请参见朝向屏幕底部的图像。这些都是打算随后读到一个应用程序,并映射到相对低分辨率的球体几何体,以实现我认为你正在寻找的效果。与预渲染动画方法或使用原始全分辨率多边形模型相比,此方法使用的内存更少

是的,这基本上是你的第二个要点,但我不会很快排除这种方法,我想你会发现你可以用一个比你预期的分辨率更低的球体;眼睛注意到纹理中的精细细节远远超过它所覆盖的几何体的低分辨率。现代意味着您可能可以让GPU轻松地为球体生成和渲染数量惊人的多边形


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

古老的方法是预先创建球体的图像,而不是在每个像素中存储表面纹理的颜色,而是将纹理UV存储为查找表。 现在,您可以通过绘制预渲染图像来渲染球体,但可以从图像中找到的UV在行星表面纹理中查找相应的纹理。为了使行星旋转,可以向查找表图像中的uv坐标添加偏移。确保使用模数加法,以便纹理很好地包裹。 如果你想在行星上着色,你可以将其作为一个单独的过程添加到纹理的顶部

这种方法很可能比没有内置图形加速的硬件上的纹理多边形版本快得多,而且由于渲染是一个预处理过程,因此您还可以使用任意多的多边形进行渲染。


但地球上不同的纬度肯定会以不同的速度滚动?而且,考虑到我希望旋转周期大约为10秒,这更像是500×500时的250帧,或者大约220 MB的未压缩数据…这可能是更好的目标。+1我不确定它是否完全回答了这个问题,但我真的很喜欢这样预测可能性的想法…嗯,听起来OP有他的基本策略