【问题标题】:OpenGL ES 2.0 screen scroll: translate vs. setLookatMOpenGL ES 2.0 屏幕滚动:翻译与 setLookatM
【发布时间】:2014-08-16 23:22:24
【问题描述】:

对于只有大约 500 个单独对象的 3D 世界,每个对象仅绘制大约 20 个三角形,这可以更快地模拟 x-y 平面中的滚动:转换所有对象的 x 和 y 或更改每个绘制的 setLookAtM 参数框架?

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

我想这个问题可以归结为“哪个需要更少的时间?”:

  1. 执行 (1,000) 个浮动添加(1000 个添加 = 500 个对象 x 2 个浮动添加 [x+x_offset & y+y_offset] 用于翻译。无论如何,我必须使用 translateM 为所有对象更新 x 和 y,无论是否执行滚动与否。)

  1. 一次调用即可更改 setLookAtM 参数。

或者有没有更好(更快)的方法来模拟使用 OpenGL ES 2.0 的滚动?

【问题讨论】:

    标签: java android performance matrix opengl-es


    【解决方案1】:

    我不完全确定您翻译每个对象的意思。无论如何,每个对象都应该根据它的位置进行平移 - 意思是,每个对象都有一个定义的 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 应该检查对象的位置与玩家位置的距离(因为如果太远,它将在相机之外,因此不需要绘制它)。

    无需更改查看矩阵,您只需进行一次全局平移,然后根据其实际位置单独平移每个对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多