我需要绘制2D空间滚动射击游戏的背景。我需要实现3层恒星:一个远处的星云(移动速度很慢)在背景中,一层远处的恒星(移动缓慢)和一层近距离恒星(正常运动)在另外两颗恒星之上。
我第一次尝试这种方式的方法是使用3个320 x 480的纹理,它们是透明的星星。我使用了GL_BLEND和SRC_ALPHA,ONE_MINUS_SRC_ALPHA。
即使在3GS上,结果也不是很好。在第一代设备上,FPS下降到40..50所以我认为我这样做是错误的。
当我禁用GL_BLEND时,即使在第一代设备上也一切都很好,并且FPS再次回到60 ......所以我必须尝试将大透明纹理贴上标签。
问题是我不知道如何以其他方式做到这一点......
我是否应该像第一个不透明的纹理那样绘制第一个星云,然后尝试模拟中间和顶部的星星图层,并在屏幕上移动小点?
混合问题还有其他方法吗?如何加快渲染过程?一个大的纹理(tileset)是答案吗?
请帮帮我,因为我被困在这里,我无法离开。
答案 0 :(得分:5)
我不知道您希望星星看起来如何,但您可能希望尝试使用GL_POINTS
或DrawElements
中的DrawArrays
将它们从纹理移动到几何体也许只是用几何图层替换顶部的两层。您可以使用PointSize
,PointSizePointerOES
和PointParameter
来操纵这些点来修改点的渲染。
答案 1 :(得分:3)
您可能希望使用多纹理来查看是否加快了速度。每个多纹理阶段都可以分配一个唯一的变换矩阵,因此您应该能够以不同的速度翻译每个图层。
我相信所有iPhone型号都支持两个纹理阶段,因此您应该能够将两个图层组合成一个绘图调用。您可能仍需要为第三层进行混合。
另请注意,alpha 测试可能比alpha 混合更快。
祝你好运!答案 2 :(得分:1)
后面的星云肯定是不透明的;其他一切都被绘制在它之上,我认为它背后唯一的东西是黑色。此外,骄傲有一点:假设你的星星层可以有效地1位alpha,这绝对是你可以尝试的东西。如果做不到这一点,Harald提到的GL_POINTS技术也会起作用。