新手OpenGL ES 2.0数学问题

时间:2011-06-01 11:28:20

标签: math shader opengl-es-2.0

在抵抗ES 2.0的强大力量一段时间之后,我终于放弃了自己并尝试吞下尽可能多的嘴巴。这是我的问题。根据一些好书和例子,我的顶点着色器无法看到顶点之间的连接,但片段着色器不能。

然后

1)可以安全地说我可以在片段着色器中执行所有OpenGL数学运算(例如矩阵计算,矢量操作等)以便受GPU限制吗? (在我看来,在将顶点数据提供给着色器之前,所有示例仍然在CPU端执行3d数学运算。)

2.a)如果是,我应该转储所有ES 1.1数学库并在GLSL中写一个新的吗?

2.b)如果是,片段着色器会处理骨骼动画吗?

2.c)如果是,我应该在哪里进行剔除?假设我想申请AABB和Frustum。对我来说,放置这种剔除的最合理的位置仍然是在CPU侧b / c,最终会减少进入着色器的顶点数量。否?

2 个答案:

答案 0 :(得分:1)

1)安全且有效吗?是。

2a)你应该这样做吗?也许,GPU性能取决于CPU和GPU工作负载之间的平衡,因此将所有内容移动到GPU可能会减慢一切。在CPU上进行一些计算可以减少GPU工作量。在做出如此重大的决定之前,对其进行平衡和分析由于这个原因,大多数游戏都有一个CPU数学库。

2b)不,这通常由顶点着色器处理。

2c)取决于剔除的类型,OpenGL已经进行了截头剔除,你可以自由地对CPU进行剔除,但是再次平衡CPU和GPU之间的工作量。每像素剔除应在片段着色器中完成。

答案 1 :(得分:1)

黄金法则是不做必要的操作!这就是你在CPU上计算变换矩阵的原因(因为它不会改变每个片段甚至每个顶点)。因此,您只需要将每个顶点乘以一个矩阵(CPU上的一个矩阵运算通常仍然优于GPU上的数千个)。将所有内容移动到片段着色器中以使应用程序GPU受限是一个坏主意。当然,如果你对每个片段做了很多不必要的操作,那么你可能会受到GPU的限制,但是为了什么,如果避免这些改进,你会获得更多的整体性能和相同的结果?

请记住,简单的4x4矩阵运算在CPU上的成本也是可以忽略不计的,因为每个对象最坏一次。骨骼动画(通过顶点混合)是另一回事。这通常在顶点着色器中完成,因为变换按顶点变化。但是,再次将这些计算移动到片段着色器中除了可能性能较低之外什么都不会获得。

请记住,像视锥体剔除这样的事情只会减少每顶点操作(并且通常会绘制调用),因为在顶点着色器和基元装配(以及可能的几何着色器)之后,无论如何都会将视图折叠到视锥体上。因此,专注于CPU侧的大规模剔除,如视锥体剔除和可能的遮挡剔除(这也减少了过度绘制,因此也减少了片段着色器调用)。但是像Matias所说的那样,开销需要与整体性能提升相平衡。