如果您有一个基于 2D 瓷砖的游戏,并且您希望允许玩家缩小(并看到更多的世界),您将如何实现它?
通常我只会渲染在游戏的 glOrtho 视图中可见的图块,但如果我允许缩放,那么浮点精度会严重破坏试图让所有东西对齐(相信我这比听起来要困难得多)。是渲染整个世界的正确解决方案,并让 OpenGL 处理不渲染不可见内容的担忧吗?
您可以通过发送来渲染稍大的区域,这肯定会适合您的视图,但还不够大。
您的问题没有提到您的 2D 是否允许相机旋转。可见区域可以表示为瓦片空间中的边界矩形:
Width_In_Tiles := RoundUp(View_Width_In_Px / Single_Tile_Width_In_Px * Zoom);
Left_Margin := Center_Of_View - RoundUp(Width_In_Tiles / 2);
Right_Margin := Center_Of_View + RoundUp(Width_In_Tiles / 2);
//same for vertical axis
//Naive example
for K := Top_Margin to Bottom_Margin do
for I := Left_Margin to Right_Margin do
RenderTilesAndObjects(I, K);
我会将瓦片渲染为纹理,然后使用比屏幕大一瓦片宽度的四边形渲染整个场景。将该四边形转换为您的全局位置,以瓷砖宽度为模。然后opengl的内置纹理过滤将处理抖动。这也具有潜在的速度优势。无需在每一帧渲染屏幕上的所有图块,您只需沿着纹理的周边渲染新可见的图块,并且偶尔(当屏幕边缘穿过图块边界时)您必须blit 纹理的内容。
对于缩放,您可以使用类似的想法,但使用 mipmapping。