OpenGL ES 2.0屏幕滚动:translate与setLookatM

时间:2014-08-16 23:22:25

标签: java android performance matrix opengl-es

对于只有大约500个单独对象的3D世界,每个对象只能绘制大约20个三角形,这样可以更快地模拟x-y平面中的滚动:翻译所有对象' x和y OR为每个绘制的帧更改setLookAtM参数?

(假设每帧都可以在屏幕上显示所有对象,而且大多数对象都像小扁平(薄)盒子。)

我想这个问题归结为"哪个花费更少的时间?":

  1. 执行(1,000)浮点加法(1000个加法= 500个对象x 2浮点加法[x + x_offset& y + y_offset]进行翻译。无论是否滚动,我都必须使用translateM对每帧的所有对象更新x和y表演与否。)
    1. 一次更改setLookAtM参数的调用。
    2. 或者是否有更好(更快)的方法来模拟使用OpenGl ES 2.0进行滚动?

1 个答案:

答案 0 :(得分:0)

我不完全确定翻译每个对象的意思。每个对象都应根据其位置进行翻译 - 这意味着每个对象都有一个定义的x / y,当你绘制它时,你会做如下的事情:

glPushMatrix()
glTranslate(position.x, position.y);

// Draw object

glPopMatrix()

现在,您要确保您的相机始终位于移动的某个位置。例如,假设你总是以玩家的位置为中心,可以移动。

glLoadIdentity()
glTranslate(-playerPosition.x, -playerPosition.y);

for each drawable object:
  if (isObjectWithinCamerasView(object)) // no need to draw objects outside of the viewport
    object.draw()

方法isObjectWithCamerasView应该检查对象的位置离玩家位置的距离(因为如果它太远,它将在摄像机外部,因此不需要绘制它)。

无需更改外观矩阵,在根据实际位置单独翻译每个对象之前,您只需要一个全局翻译。