对于我正在开发的计算机游戏,我想绘制非常大(~500像素)的行星图形慢慢旋转。这些图形意味着令人印象深刻。这样做的最佳方式是什么?
这是一个动画GIF的例子我的意思。 (在100x100像素和60帧时,它已经相当巨大,抱歉。)想象一下,这个更大,更大,旋转更慢,动画更流畅:
但如果这是500x500像素和10 x 25 = 250帧,我们将谈论数百MB的数据,所以这种简单的方法不起作用。
答案 0 :(得分:6)
Fracplanet可以保存“spheremap”纹理贴图(和凹凸贴图);看到gallery底部的图像。这些是随后读入应用程序并映射到相对低分辨率的球体几何体,以达到我认为你正在寻找的效果。此方法将使用比预渲染动画方法或使用原始全分辨率多边形模型更少的内存。
是的,这基本上是你的第二个要点,但是我不会那么快地排除这种方法,而且我认为你会发现你可以获得比你预期的更低分辨率的球形;眼睛注意到纹理中的精细细节远远超过它注意到它所覆盖的几何体的低分辨率。现代tessellation hardware意味着你无论如何都可以让GPU轻松生成并为球体渲染一些荒谬的多边形。
另类想法:渲染足够大的单个方形四边形多边形以覆盖行星。对于其中的每个像素,执行像素着色器,计算屏幕 - 光线 - 球体交叉点(如果有)。从行星纹理中查找颜色(考虑时间和行星旋转)。避免了对大量多边形的需求,并为您提供精确的球体。
答案 1 :(得分:2)
如果你想要图形加速,那么多边形便宜 - 相当多的多边形不是问题。
我建议使用立方体贴图纹理和相应的立方体状三角形网格:以围绕原点的立方体(表面)形状的顶点网格开始,并将每个3D坐标标准化为单位半径。这样可以轻松计算纹理坐标。
请记住,您需要为纹理选择正确的投影:在上述情况下,您需要为每个立方体面添加切线投影,以匹配您的网格。
答案 2 :(得分:2)
这样做的古老方法是预先创建一个球体图像,但不是在每个像素中存储表面纹理的颜色,而是将纹理UV存储为查找表。 现在,您可以通过绘制预渲染图像来渲染球体,但可以从图像中找到的UV中查找行星表面纹理中的相应纹理像素。为了使行星旋转,您可以为查找表图像中的uv坐标添加偏移量。确保使用模数添加,以便纹理包裹得很好。 如果你想要在地球上着色,你可以在纹理顶部添加一个单独的传递。
这种方法很可能比没有内置图形加速的硬件上的纹理多边形版本快得多,并且您也可以使用任意多个多边形来渲染它,因为渲染是一个预处理。
答案 3 :(得分:1)
如果你进行预渲染,那么根据玩家实际看到它们的可能性,算法会在游戏运行时渲染所需的帧怎么样 - 从“确定”下降到越来越不可能的基础游戏引擎可以允许玩家在x秒时间内与哪个帧在那个时间应该在视野中,到“不可能”并因此不被渲染?
答案 4 :(得分:1)
如果你的行星将始终与屏幕正交旋转,那么只有一个行星纹理滚动并被圆圈遮挡。
如果你想要一个任意的旋转轴,你会想要问自己哪个更容易,3D解决方案或使用几个压缩纹理来保存所有帧。如果您已经轻松使用3D管道,请使用它。
如果你制作一个256x256的帧,你可以在1024纹理上适合16,所以60帧只需4个纹理。使用DXT3压缩,你可以预期每个纹理大约1 MB(非常合理)。
答案 5 :(得分:0)
您可以围绕对象移动相机(实际上只有当所有东西都居中时才有效),或者转换对象。后者通常已经完成。
我可以推荐一下易于学习的sf.net/projects/a3d。 draw_asteroids
使用glRotate
来电,就是这样。
此外,如果我没有正确地听到,Doom3引擎引入了bezier线,因此游戏中的圆角(或球体)应用于此案例 - 不需要由量化点组成(产生丑陋)您正在考虑的网状网络。)
答案 6 :(得分:0)