我可能会问一个愚蠢的问题,但我对opengl es 2.0性能有些好奇。
假设我有一个图形对象,其中包含一个顶点数组“ VA”,一个缓冲区数组“ BA”和/或一个模型矩阵“ MM”,并且我想每帧至少执行一次平移和一次旋转。那么,最好的选择是什么?
我的视锥细胞是关于性能,即处理/内存比率。我认为第三个选项可能是因为GPU最好,但是在内存方面也是最昂贵的,因为每个对象都必须有一个MM,对吗?
我认为的另一个解决方案是将平移和旋转参数传递给着色器,然后在着色器上组装MM。
如何做到最好?
这不是一个愚蠢的问题,但是不幸的是,这完全取决于情况。通常,如果顶点数据不断变化,即使在GPU上使用顶点缓冲区也不是最好的主意,但我想事实并非如此。
因此,您所考虑的两个主要差异是:
因此,如果顶点数据的变化超出了矩阵或任何其他类型的分析表示的顶点转换可以呈现的范围,则第一个选择实际上是好的。例如,如果您一直在CPU上生成随机位置。在这种情况下,即使使用顶点缓冲区也几乎没有意义,因为无论如何,您都需要保持流传输顶点数据。
第二种方法在基本顶点数据相对静态(在每个帧上变化不大)的情况下非常有用。您将顶点数据一次(或不时一次)推入GPU,然后使用顶点着色器为您转换顶点数据。GPU上的顶点着色器这样做非常有效,并且比在CPU上应用相同的算法要快得多。
关于您的问题:如果您有大量的顶点数据,第三个选项很可能是最好的,但我不会说这在内存方面很昂贵,因为矩阵由16个浮点数组成,自6 3d起应该比较小顶点位置会占用更多的内存,因此您完全不必担心。如果有任何问题,您应该担心要流向GPU的数据量,而使用此选项再次最少。
将平移和旋转传递给顶点着色器,而不是为每个顶点组成矩阵,可能不是最好的主意。此处发生的是,您向GPU发送4 + 3浮点数(而不是16浮点数)的流量有所增加,但首先要分两步发送,这会产生开销。除此之外,您消耗的内存要多得多,然后要减少,因为无论如何您都需要在着色器中创建矩阵。如果这样做,您将为每个顶点着色器计算一个新矩阵,这意味着每个顶点。
现在关于这些矩阵和内存,很难说它将对内存本身产生任何影响。堆栈大小通常是固定的,或者至少是四舍五入的,因此,是否将矩阵添加到着色器中,很可能根本不会在任何内存消耗上产生任何差异。
关于openGL和性能,您首先需要注意:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句