预测静态世界空间的OpenGL模型转换

时间:2018-04-11 06:26:41

标签: performance opengl gpu

我正在开发用于导航3D数据集的OpenGL可视化。简而言之,可视化采用了大量(约100万个数据点)矩阵阵列,然后进行特征分解并可视化为椭圆体。

我发现当我“预先”计算椭球顶点变换时(即仅在CPU上计算所有模型变换),性能会显着提高,而不是在着色器中(必须为每次绘制计算模型变换) )。对于场景导航/照明等,视图和投影变换与传递给相关着色器的制服一样正常计算。 这种方法的结果是程序需要更长的时间来初始化(由于CPU被绑定计算所有模型转换),但帧速率明显更高。

我从this了解到,分解矩阵以避免不必要的着色器计算是很常见的,但是我没有遇到任何描述完全预先计算世界空间的实践。

我知道这种方法仅适用于我的狭窄用例(即场景是静态的,这意味着在程序运行时,世界空间中顶点的位置永远不会发生变化)。除此之外,有什么重要的理由我应该避免这样做吗?

1 个答案:

答案 0 :(得分:1)

从静态对象中删除冗余转换是一种常见的优化方法。您的对象在世界上是静态的,因此您已将所有冗余转换折叠到场景的根目录,这不是问题。

话虽如此,您所看到的性能提升可能不是来自在着色器中进行模型转换的成本,而是来自将该转换传递给每个对象的着色器。您还没有详细说明如何组织椭圆体,但如果您使用模型矩阵统一更新程序并为每个椭球发出一个DrawElements调用,那确实非常慢。即使做一些更奇特的事情 - 比如使用实例并在VBO中传递每个变换 - 你仍然会有更新它们的开销,你现在可以避免。如果您还没有这样做,可以将椭圆体顶点分组为大型数组,并仅使用几个DrawElements调用绘制它们。