如何在一个绘图循环中渲染多个对象

时间:2017-12-15 10:32:21

标签: opengl

我是shang的opengl新手,在尝试在绘图循环中渲染多个对象时遇到了麻烦。

所有对象都在VAO中组织,它们被复制到CPU内存中 模型空间。 这意味着如果一个对象的位置,旋转或缩放发生变化,我必须更改并重新计算绘图调用之间的主矩阵。

只要我只渲染一个对象,一切正常。 我的理解是我将模型或mvp矩阵的地址传递给着色器。 如果我改变 - 外部 - 它在不同对象的绘制之间的内容, 它们将使用此变量的不同内容绘制。 我不想重新计算着色器内部的内容,因为它们的值仍然存在 与当前对象的整个网格相同。

这不起作用 - 应用matix一次并绘制所有对象 及其价值观。

如何在必须渲染多个对象的游戏引擎中完成 一个绘图循环。

提前致谢

1 个答案:

答案 0 :(得分:0)

在典型的渲染周期中,每个对象都有自己的变换,必须独立于其他所有变换进行计算。您不需要重新计算视图或透视变换。

因此,您的典型渲染周期将如下所示:

对于每个对象:

  1. 检查对象是否可见(使用旗帜或其他东西)
  2. 如果(1),重新计算它的变换矩阵,并启用着色器
  3. 将矩阵数据发送到着色器
  4. 绑定任何灯光和相关照明数据
  5. 绑定VAO以及与网格相关联的任何纹理(材质)。
  6. 使用顶点/索引计数作为参数,在VAO句柄上调用glDrawArrays
  7. 取消绑定所有内容,禁用着色器并继续下一个对象。
  8. 从这个循环中可以看出,每个变换对每个对象都是唯一的。其他任何情况都不是这样。 VAO和材料可以重复使用,视图和投影矩阵也可以重复使用。

    所以,你不在gpu上计算矩阵,你在cpu上计算矩阵,然后将结果作为统一发送到着色器。