我正在创建一个基于图块的 2D 游戏,作为学习基本“现代”OpenGL 概念的一种方式。我正在使用带有 OpenGL 2.1 的着色器,并且熟悉渲染管道以及如何在屏幕上实际绘制几何图形。我想知道的是组织瓷砖地图以快速有效地渲染的最佳方式。我想到了几种可能的方法:
1.) 将表示单个图块(顶点和纹理坐标)的四边形存储在 VBO 中,并使用单独的draw*
调用渲染每个图块,将其转换为屏幕上的正确位置,并使用uniform2i
该图块在纹理图集中给出该特定图块的位置;
2.) 保留一个包含屏幕上每个图块(已计算的屏幕坐标和纹理图集坐标)的 VBO,BufferSubData
用于每帧更新图块,但使用单个draw*
调用;
3.) 保持包含静态 NxN“块”瓦片的 VBO,绘制许多瓦片块在屏幕上至少部分可见,并将它们每个转换到位置。
*如果可能,我想远离最后一个选项,除非渲染 64x64 的块不是太低效。瓷砖以该大小的块加载到内存中,即使一次只能在屏幕上看到大约 20x40 的瓷砖,我也必须一次渲染多达四个块。这种方法还会以其他几种方式使我的代码复杂化。
那么,其中哪一种是渲染图块屏幕的最有效方法?有没有更好的方法?