虽然我已经足够理解OpenGL的状态设计来使用它,但我仍然难以在CPU/GPU上可视化内部工作。目前我一直在想VBO是如何使用GL_ARRAY_BUFFER复制到GPU上的。
我以前认为VBO是GL_ARRAY_BUFFER的一种“状态”,这使我想到了3种不同的工作方式,如下所示。
以下线程的顶部答案解释:“缓冲区对象的GL_ARRAY_BUFFER目标表示将该缓冲区对象用于顶点属性数据的意图”What does the GL_ARRAY_BUFFER target mean in glBindBuffer?
据我所知,这意味着GL_ARRAY_BUFFER是VBO的一种“状态”。它 * 可以 * 有不同的状态,但它确实需要有一个状态才能复制到"GPU缓冲区“/GPU上分配的较小缓冲区?还是我误解了它?”绑定“与设置状态有什么不同吗?(下面没有可视化第四个选项)
这四个想法中有一个是准确的吗?或者是完全不同的东西?为这个可怕的图表道歉。我希望它足够清楚。
如有任何确认/更正,将不胜感激!
我还看了这篇文章What exactly is a VBO in OpenGL?
“由于此处使用GL_ARRAY_BUFFER作为目标参数,因此此操作(glBufferData(...))将影响当前绑定为GL_ARRAY_BUFFER的业务对象。
完成所有这些操作后,VBO现在包含了所有的顶点数据。
基本上,是的。”
这意味着GPU上的VBO内存是通过GL_ARRAY_BUFFER设置的,这是我最初理解的。
选项3和4在我看来是最合理的。根据上下文,VBO和GL_ARRAY_BUFFER是否同时是彼此的状态?哪个VBO是活动的/哪个目标对于VBO是活动的
2条答案
按热度按时间6yt4nkrj1#
坦率地说,它不是你列出的任何选项。
GL_ARRAY_BUFFER
是一个客户端绑定点,用于命名你用其他命令操作的活动缓冲区。它纯粹用于与驱动程序通信。此外,通过DSA(直接状态访问,OpenGL 4.5+),你可以完全设置一个VBO,而不必将它绑定到任何东西。下面的图表可能更适合描述这种情况:
注意
GL_ARRAY_BUFFER
绑定点可以由驱动程序或用户进程libGL跟踪,这不是必须的。nnt7mjpx2#
glBufferData
创建缓冲区对象和缓冲区的数据存储,并可选地初始化数据。只要不调用glBufferData
,就没有对象和保留的(GPU)数据存储。缓冲区的大小是不可变的。glGenBuffers
仅创建缓冲区的“名称”(缓冲区ID)。实际上,缓冲区没有类型。然而,缓冲区可以用于不同的事情,每个目标(如
GL_ARRAY_BUFFER
)可以绑定不同的缓冲区。GL_ARRAY_BUFFER
仅用于在各种API函数中标识缓冲区。