画非常大的缓慢旋转的行星

我想绘制非常大(〜500像素)的行星慢慢旋转的graphics。 这些graphics是为了留下深刻的印象。 这样做的最好方法是什么? 我没有任何特定的3D引擎的经验,我甚至不知道这个游戏会运行在什么平台上,所以:

  • 我可以预先渲染每个帧,但是在500px和10秒的旋转周期内,每个星球的数据量是可笑的。
  • 我可以使用3D引擎,将行星的纹理映射到一个接近球体的网格上,但是在500px的时候,我担心多边形的数量必须很大才能使它看起来很好。
  • 我可以编写一种自定义3D引擎,通过将每个视图像素的x / y坐标转换为球体纹理的坐标空间,从而高效地渲染纹理球体,但是这种方法涉及到,并且无法从中受益graphics加速。
  • 还有什么我没有想到的?

下面是我的意思是一个animationGIF的例子。 (在100×100像素和60帧的情况下,已经非常大了,对不起。)想象一下,更大,更慢的旋转,animation更平滑:

替代文字

但是,如果这是500×500像素和10 x 25 = 250帧,我们会谈论数百MB的数据,所以这种直接的方法是行不通的。

使用单个绘图调用渲染“好看”的500x500px球体的多边形数量对于GPU在大多数平台上处理是微不足道的,尤其是在场景中没有其他东西的情况下。 还有一些关于纹理球的注意事项,以避免纹理变形; 确保使用立方体贴图。

由于您正在用恒定的相机查看球体,因此可以使用简单的预先计算的查找表以极快的速度进行高质量的渲染。

作为预先计算的步骤,使用任何你喜欢的方法(通常使用多边形或光线跟踪),将纹理映射的球体渲染到离散缓冲区,但是不是基于纹理计算颜色,而只是存储纹理u / v坐标。

然后,在渲染实际行星时,渲染一个简单的正方形,对于每个像素,使用这些u / v坐标从查找表中获取实际的u / v坐标,并从行星纹理获取像素颜色。 要旋转球体,只需用旋转角度偏移u坐标即可。

这种技术在demoscene中非常受欢迎,例如纹理映射的隧道效果,但不幸的是我找不到任何有关它的好教程。

如果你在2D设置中这样做,请参阅前面的问题…

3D行星纹理的幻觉

相同的概念可以很好地处理大图像,并dynamic地移动空间“洞”下的图层上的地形纹理。

阅读以上链接,了解我的意思。

如果你用现代的video编解码器压缩生成的animation,它不会特别大,几乎没有“几百MB的数据”,也不可笑…

但是如前所述,这一切都取决于你的目标平台和其他人所说的。 只是渲染一个平滑的3D球体实际上只涉及很less量的多边形和很less的数据存储(即使在真正的高分辨率下,纹理也是如此,标准的jpeg压缩会使其失效)。

这一切还取决于你是多么的挑剔 – 如果你在四分之一像素滚动外观和纹理的细节与先进的演示齐头并进,而不仅仅是当代游戏的所有插值和混叠甚至在8x FSAA的问题 – 那么它可以得到几乎无尽的参与(以及需要一些艺术的诡计)^^

如果在执行此操作时遇到问题,那么传统的方法(高多边形球体上的纹理和法线贴图)就不能解决问题:

“光线追踪”它与片段着色器。 如果你的相机是固定的,你只需要一个统一的浮点input到你的片段着色器(旋转角度),着色器可以负责计算纹理坐标。 照明vector甚至可以是每帧相同的。 至于抗锯齿,你也可以得到一个完美的球形轮廓,有点聪明(如果像素在球体边界,计算其覆盖范围)

这样你只能通过管道发送4个顶点,并不需要你分配一个巨大的多重采样帧缓冲来对抗锯齿。

不得不提出几个按需定制的algorithm。