OpenGL 3.3地图渲染技术?

我试图从一个纹理中将常规2D图块绘制到屏幕上,但是有几种方法可以实现这一点,我不觉得我对渲染有足够的了解,以便正确评估折中。

首先,我有很多可以渲染的图块。 每个图块都是8-32px(取决于缩放因子),而每个图层的全高清显示器上有超过50万个图块(超过一百万个三角形),而且我有两个图层。 虽然我不会为了支持大屏幕而大放异彩,但我确实希望在任何缩放的情况下为屏幕高达2048x2048px的玩家提供可靠的可靠体验,最终效果大约是四分之一一百万个三角形(在非瓦片精灵,效果和HUD元素之前添加)。

我已经得到了很多关于瓷砖地图什么是好的和什么是坏的建议的冲突…到目前为止,最好的方法是实例化6点,两个三角形在方形configuration,给每个实例一个位置和纹理的位置。 但是现在我被告知实例化了less于100个顶点会产生大量的开销……显然,使用几何着色器来产生顶点也是疯狂的昂贵和不切实际的。 有时候我被告知三角形条带是要走的,但是当你有地图间隙时,你必须添加杂乱的退化三角形。 有时三角形被认为是更好的。

是否所有的道路都回到静态的arrays中,以达到效率?

另外,当你向左,向右,向上,向下移动时,你需要添加更多的瓷砖到一边…但是,如何? 有没有办法做到这不杂乱和复杂?

如何将它们集成到“超级瓷砖”? 你可以画一组瓷砖到一个“超级瓷砖”,例如,512x512px。 当你第一次出现在屏幕上的时候,你只需要填写一个超级瓷砖,然后你只需要把超级瓷砖拖到屏幕上。

为了保持性能超级平滑,您可以为每个不在屏幕上的超级拼贴准备常规拼贴(而不是超级拼贴)网格,然后在需要时将其绘制到渲染目标。 您可以准备几个帧的常规瓷砖网格,以减less您在绘制到一个新的超级瓷砖时的性能“打嗝”的机会。

这些常规瓷砖网格可以完成任何你提到的方式 – 实例化,几何着色器或静态网格。 我推荐后者,因为实例化和几何着色器在这种情况下并不真正帮助你,但是在这种情况下也没有真正受到伤害,因为整体性能并不是真的依赖于偶尔准备一个新的超级瓷砖。

这种“超级瓦片”技术的一个变种是将单个常规瓦片根据需要渲染到它们各自的超级瓦片中 – 所以如果只有超级瓦片的边缘在屏幕上,那么只有那些边缘上的常规瓦片已经被绘制进入超级瓷砖的纹理。 在这种情况下,由于您一次只绘制相对较less的新图块,因此用于渲染常规图块的技术几乎是无关紧要的,所以如果在创建新的超级图块时遇到打嗝问题,尤其值得探讨根据我的第一个建议。 这里的复杂性在于你需要跟踪哪些常规的tile已经被绘制到它们的超级tile中,所以你不需要将常规的tile重新绘制到它们的超级tile中。 不过,这应该不是一个大问题。

我的第一个想法是,你正在渲染太多的瓷砖。 您是否真的从2048×2048分辨率的8x8px拼贴中获得任何细节? 但是这可能与这个问题无关,除非你想考虑减less你正在渲染的tile的数量,以减轻着色器的负担。

我的第二个想法是,你应该使用静态网格来表示地图的整个可见部分,并在视口之外延伸一些行和列,以消除可见的重绘,然后用可见的图块纹理每个三角形。 你可以通过计算你的摄像头当前指向哪一个瓦片来确定哪些瓦片是可见的,但我相信你已经知道如何做到这一点。 跟踪你所指向的任何区域内的偏移量(IE,“我的相机指向平铺3,2,偏移量为-2,-14”),你永远不需要实际生成任何顶点。

这意味着是的,就原始的“最less计算次数”而言,你不能小于零。 你仍然需要应用一个转换matrix,但是你会这么做。

我在白天学到的另一个技巧(和Jibb的“超级瓷砖”概念相似)是将整个屏幕渲染成单一纹理,然后渲染该纹理加上相机最后一次移动后所添加的任何内容。 当时,这并没有在我正在研究的平台上产生显着的性能改进,但可能值得考虑。

至于如何添加新的瓷砖视图,你总是要呈现WxH的价值瓷砖。 你只是改变起始瓦片。 所以如果你的屏幕是100块宽的块,而你的相机指向块0的话,你就会渲染块0-99。 当相机移动并且现在位于拼贴1上方时,将渲染拼贴1-100。 等等。