Performance 为静态世界空间预先计算OpenGL模型转换

Performance 为静态世界空间预先计算OpenGL模型转换,performance,opengl,gpu,Performance,Opengl,Gpu,我正在开发一个用于导航3D数据集的OpenGL可视化。简单地说,可视化需要约100万个矩阵数据点阵列,然后将矩阵特征分解并可视化为椭球体 我发现,当我提前计算椭球体顶点变换时,性能会显著提高,即仅在CPU上计算一次所有模型变换,而不是在着色器中,在着色器中必须为每个绘制计算模型变换。对于场景导航/照明等,视图和投影变换的计算方法与传递到相关着色器的方法相同。 这种方法的结果是,由于CPU在计算所有模型转换时被占用,程序初始化所需的时间更长,但帧速率明显更高 我从中了解到,分解矩阵以避免不必要的着

我正在开发一个用于导航3D数据集的OpenGL可视化。简单地说,可视化需要约100万个矩阵数据点阵列,然后将矩阵特征分解并可视化为椭球体

我发现,当我提前计算椭球体顶点变换时,性能会显著提高,即仅在CPU上计算一次所有模型变换,而不是在着色器中,在着色器中必须为每个绘制计算模型变换。对于场景导航/照明等,视图和投影变换的计算方法与传递到相关着色器的方法相同。 这种方法的结果是,由于CPU在计算所有模型转换时被占用,程序初始化所需的时间更长,但帧速率明显更高

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


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

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

话虽如此,您看到的性能提升可能不是来自在着色器中执行模型变换的成本,而是来自将该变换传递给每个对象的着色器。关于如何组织椭球体,您没有说太多,但是如果您使用统一的模型矩阵更新程序,并为每个椭球体发出drawerelements调用,那么这确实非常慢。即使做一些更奇特的事情——比如使用实例并在VBO中传递每个变换——您仍然会有更新它们的开销,现在您可以避免这些开销。如果尚未执行此操作,则可以将椭球体顶点分组到大型数组中,并只需调用几个抽屉元素即可绘制它们