Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization opengles2.0中VBO的优化_Optimization_Opengl Es 2.0_Vertex Buffer - Fatal编程技术网

Optimization opengles2.0中VBO的优化

Optimization opengles2.0中VBO的优化,optimization,opengl-es-2.0,vertex-buffer,Optimization,Opengl Es 2.0,Vertex Buffer,我的系统由几个表示四边形的对象组成。每个四边形由相同的顶点表示,因此,每个对象仅存储表示对象在世界中的变换的矩阵及其自己的对象空间。在每个渲染过程中,使用帧变换更新这些矩阵后,它们将与当前视图和投影矩阵相乘,以形成该对象的MVP矩阵。然后,对象顶点与MVP矩阵一起发送到着色器,在着色器中,顶点与MVP矩阵相乘。这里的低效之处在于每个四边形都是单独绘制的,这意味着每个四边形都有一个单独的调用元素。在任何给定的时刻,可能有50或60个四边形存在,一些移动到范围之外并被破坏,或者它们的动画可能完成,因

我的系统由几个表示四边形的对象组成。每个四边形由相同的顶点表示,因此,每个对象仅存储表示对象在世界中的变换的矩阵及其自己的对象空间。在每个渲染过程中,使用帧变换更新这些矩阵后,它们将与当前视图和投影矩阵相乘,以形成该对象的MVP矩阵。然后,对象顶点与MVP矩阵一起发送到着色器,在着色器中,顶点与MVP矩阵相乘。这里的低效之处在于每个四边形都是单独绘制的,这意味着每个四边形都有一个单独的调用元素。在任何给定的时刻,可能有50或60个四边形存在,一些移动到范围之外并被破坏,或者它们的动画可能完成,因此它们也被破坏,但更多的四边形将随机进入存在。将所有必需的值存储在VBO中,并且在每次传递过程中只调用一次GLD元素,是否会有显著的性能提升

存储所有 在VBO中使用必需的值,并在 每次通行证

是的,会快得多。正如您正确识别的,第一个原因将是一个
glpaurements
调用。第二是VBO将数据保存在GPU本身

如果四边形移出范围,您可以将其内存重新用于新四边形。VBO可用于绘制缓冲区的子区域,因此无需内存分配即可获得很大的灵活性


通过使用VBO,您可以最大限度地减少与GPU的交互,从而获得性能优势。

让我们首先用一些简单的数学来说明这一点:

  • 目前,您不需要将任何顶点数据推送到GPU(每帧),但12-16浮动每个四边形的矩阵数据,并在CPU上执行每个四边形的矩阵乘法
  • 在一个VBO中放置所有对象时,每个四边形必须传输4个顶点(~12个浮点),但没有矩阵数据(当然,全局VP除外),并且必须在CPU上执行4个矩阵向量乘法(~1个矩阵乘法)
因此,传输的工作量和数据量实际上变化不大。但变化是,传输的数据从许多小的统一更新转移到单个大的VBO更新,这很可能更快(这两个原因都是缓冲区更新从硬件方面可能比多个统一更新更快,但请不要告诉我这一点,第二个原因是大大减少了驱动程序开销). 最重要的是,通过使用一个大的draw调用,而不是许多小的调用,可以减少更多的开销


因此,是的,这当然值得一试,但如果它在您的特定应用程序中确实是一个“重大”改进,则必须对其进行评估。

谢谢。但是,在实现这一点时,我看到了另一个令人困惑的方面。我的旧实现还为每个四元组传递了一个统一的alpha值。将所有这些数据存储在一个VBO中效果很好,但我需要将alpha值保存到片段着色器中。我知道的唯一方法是在顶点着色器中设置一个变量。但是如果我这样做的话,alpha值将被插值到每个片段上。对的显然不是我想要的。有什么建议吗?@Joey Carson只是将alpha值设置为额外的逐顶点属性,并将其传递到顶点着色器中的一个变量中。只要对单个四边形的每个角点使用相同的值,该值对于该四边形的每个片段都是相同的(因为在1和1之间插值只能得到1,而变量只能在单个三角形内插值,而不能跨不同的三角形插值)。每个顶点增加的单个值(而不是每个四边形)也不会有什么坏处。啊,当然!只要这些值相等,它们就不可能插值。我想得太多了。。再次感谢。