Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Opengl 使用VAO是否消除了使用多个VBO所产生的开销?_Opengl - Fatal编程技术网

Opengl 使用VAO是否消除了使用多个VBO所产生的开销?

Opengl 使用VAO是否消除了使用多个VBO所产生的开销?,opengl,Opengl,据我所知,不建议进行多个VBO绑定调用,因为这会产生CPU开销。但是,既然您让OpenGL自动重新绑定这些VBO,那么将多个VBO绑定到一个VAO,然后绑定该VAO是否会减少或完全消除绑定多个VBO的开销?这是假设GPU知道该做什么,而OpenGL不是在CPU上为您做的 我到处找了找,找不到任何结果。我目前一直使用OpenGL,这些东西完全是特定于实现的。它将减少对驱动程序的一些函数调用,这可能已经值得了。但实现如何在内部处理VAO实际上是不可预测的。当VAO绑定时,OpenGL的设计方式仍然会

据我所知,不建议进行多个VBO绑定调用,因为这会产生CPU开销。但是,既然您让OpenGL自动重新绑定这些VBO,那么将多个VBO绑定到一个VAO,然后绑定该VAO是否会减少或完全消除绑定多个VBO的开销?这是假设GPU知道该做什么,而OpenGL不是在CPU上为您做的


我到处找了找,找不到任何结果。我目前一直使用OpenGL,这些东西完全是特定于实现的。它将减少对驱动程序的一些函数调用,这可能已经值得了。但实现如何在内部处理VAO实际上是不可预测的。当VAO绑定时,OpenGL的设计方式仍然会导致大量的验证,例如,一个实现将不能仅仅缓存指向内存的指针,这是VAO设置时GPU的相关内容,因为正在引用VBO名称。由于可以为同一缓冲区对象创建新的完全不同的缓冲区存储,因此实现必须至少确保缓冲区对象仍然与以前相同。所以这里有很多事情要做,这在GPU上是不会发生的,所以我不希望在这种情况下CPU开销有太大的减少。但是,我还没有对它进行分析…

使用经过良好调优的驱动程序实现,即使使用VAO,如果所有属性都在同一个VBO中,我仍然希望它更高效。德哈斯已经谈到了一个主要方面。大多数GPU不能使用CPU地址直接访问内存。缓冲区必须映射到GPU地址空间

因此,每次绑定VAO时,驱动程序必须至少检查这些映射是否已经存在,并映射尚未映射的缓冲区。跟踪draw调用的缓冲区也有开销,以确保它们在draw调用完成执行之前保持映射。您使用的缓冲区越多,所有这些都需要更多的工作

另一个方面是内存访问模式。如果属性在单个缓冲区中交错,则可以获得更好的内存访问位置。假设您有位置和法线,每个位置和法线有3个浮动,每个顶点加起来最多24个字节。如果它们是交错的,那么24个字节很可能位于同一缓存线中。如果它们位于两个单独的缓冲区中,则可以为单个顶点获得两个缓存未命中

关于VAO是否更有效的问题:
是的,如果VAO得到很好的实现,那么绑定VAO应该更有效。例如,在不使用VAO的情况下,绑定缓冲区时通常会有一系列
glvertexattributepointer
调用。这些调用传入的状态(大小、类型、步幅等)必须转换为GPU命令。对于VAO,用于设置此状态的GPU命令只能在VAO发生更改时重新生成,然后在每次绑定VAO时重复使用


虽然普通VBO使用的状态设置也可以很好地优化,但它仍然需要在驱动程序中进行更多的工作。您也有进行更多API调用的开销。

假设您有两个类型为
GL\u ARRAY\u BUFFER
的10个VBO,我认为VAO只能记住其中一个,即当前绑定的一个。我几乎可以肯定,您可以将16个或更多任何类型的VBO绑定到VAO,并且它们都会被VAO自动重新绑定。明白了,这支持您的说法;很高兴知道。