OpenGL ES。滚动3层星空纹理让我从60 - > 40 FPS

时间:2009-10-26 21:25:05

标签: iphone opengl-es textures blending

我需要绘制2D空间滚动射击游戏的背景。我需要实现3层恒星:一个远处的星云(移动速度很慢)在背景中,一层远处的恒星(移动缓慢)和一层近距离恒星(正常运动)在另外两颗恒星之上。

我第一次尝试这种方式的方法是使用3个320 x 480的纹理,它们是透明的星星。我使用了GL_BLEND和SRC_ALPHA,ONE_MINUS_SRC_ALPHA。

即使在3GS上,结果也不是很好。在第一代设备上,FPS下降到40..50所以我认为我这样做是错误的。

当我禁用GL_BLEND时,即使在第一代设备上也一切都很好,并且FPS再次回到60 ......所以我必须尝试将大透明纹理贴上标签。

问题是我不知道如何以其他方式做到这一点......

我是否应该像第一个不透明的纹理那样绘制第一个星云,然后尝试模拟中间和顶部的星星图层,并在屏幕上移动小点?

混合问题还有其他方法吗?如何加快渲染过程?一个大的纹理(tileset)是答案吗?

请帮帮我,因为我被困在这里,我无法离开。

3 个答案:

答案 0 :(得分:5)

我不知道您希望星星看起来如何,但您可能希望尝试使用GL_POINTSDrawElements中的DrawArrays将它们从纹理移动到几何体也许只是用几何图层替换顶部的两层。您可以使用PointSizePointSizePointerOESPointParameter来操纵这些点来修改点的渲染。

答案 1 :(得分:3)

您可能希望使用多纹理来查看是否加快了速度。每个多纹理阶段都可以分配一个唯一的变换矩阵,因此您应该能够以不同的速度翻译每个图层。

我相信所有iPhone型号都支持两个纹理阶段,因此您应该能够将两个图层组合成一个绘图调用。您可能仍需要为第三层进行混合。

另请注意,alpha 测试可能比alpha 混合更快。

祝你好运!

答案 2 :(得分:1)

后面的星云肯定是不透明的;其他一切都被绘制在它之上,我认为它背后唯一的东西是黑色。此外,骄傲有一点:假设你的星星层可以有效地1位alpha,这绝对是你可以尝试的东西。如果做不到这一点,Harald提到的GL_POINTS技术也会起作用。