OpenGL tile渲染:最有效的方法?

时间:2012-07-29 03:33:10

标签: performance opengl graphics 2d

我正在创建一个基于图块的2D游戏,作为学习基本的“现代”OpenGL概念的一种方式。我正在使用OpenGL 2.1的着色器,并熟悉渲染管道以及如何在屏幕上实际绘制几何体。我想知道的是组织tilemap快速有效渲染的最佳方法。我想到了几种可能的方法:

1。)将表示单个图块(顶点和纹理坐标)的四边形存储在VBO中,并使用单独的draw*调用渲染每个图块,将其转换为屏幕上的正确位置并使用uniform2i给出该特定图块的纹理图集中的位置;

2。)保持包含屏幕上每个图块的VBO(已经计算过的屏幕坐标和纹理图集坐标),使用BufferSubData每帧更新图块,但使用单draw*次调用;

3。)保持包含静态NxN“块”块的VBO,绘制许多块在屏幕上至少部分可见,并将它们各自转换到位。

*如果可能的话,我想远离最后一个选项,除非渲染64x64的块不是太低效。瓷砖以这种尺寸的块加载到内存中,即使一次只能在屏幕上看到大约20x40个图块,我也必须一次渲染最多四个块。这种方法还会以其他几种方式使我的代码复杂化。

那么,哪些是渲染瓷砖屏幕最有效的方法?还有更好的方法吗?

2 个答案:

答案 0 :(得分:7)

你可以做其中任何一个,他们可能会没事;你提出的渲染非常非常简单。

#1原则肯定会比其他选项更糟糕,因为你会绘制许多非常简单的“模型”,而不是让GPU在一次绘制调用中完成大量的批处理工作。但是,如果您一次只能在屏幕上看到 20×40 = 800个图块,那么对于任何现代CPU和GPU来说这都是一项微不足道的工作(除非您正在做一些疯狂的片段着色器)

我建议你选择最适合自己编程的游戏,这样你就可以继续游戏了。我想这可能是#1,或者可能是#2。 如果你发现自己出现性能问题,那么#2或#3(64×64听起来像一个很好的块大小)中的任何一个都可以让你花费最少的CPU时间来你的程序是绘图的一部分(即更新缓冲区)。

答案 1 :(得分:0)

我最近通过Android上的OpenGL ES 2.0自己学习现代OpenGL。 “OpenGL ES 2.0编程指南”推荐使用"结构数组",即

"将顶点属性存储在一个缓冲区中。结构表示顶点的所有属性,每个顶点都有一个这些属性的数组。"

虽然这似乎最初会占用大量空间,但它允许使用VBO进行高效渲染,并且可以灵活地映射每个磁贴。我最近在Droid 2上使用包含顶点,法线,颜色和纹理数据的交错数组进行了平铺六角形网格,其中包含20x20平铺六角网格。到目前为止,事情进展顺利。