Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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
C++ 调用glBindVertexArray(vao):如果';vao&x27;已经绑定,如何相应地设计形状类?_C++_Opengl_Vertex Array Object - Fatal编程技术网

C++ 调用glBindVertexArray(vao):如果';vao&x27;已经绑定,如何相应地设计形状类?

C++ 调用glBindVertexArray(vao):如果';vao&x27;已经绑定,如何相应地设计形状类?,c++,opengl,vertex-array-object,C++,Opengl,Vertex Array Object,我再次尝试OpenGL,我想知道如何设计稍后呈现的类。现在,只有一种类型的形状,因此我创建了一个带有静态VAO成员的类Shape,当创建Shape的第一个实例时,glgenvertexarray(1,&VAO)被调用。现在有一个方法void Shape::render(): 这是个好办法吗?我的意思是,当实际程序中绘制了Shape的所有实例时,会反复调用bindShape::vao,但我猜如果vao当前已绑定,它实际上不会做任何事情。那猜测正确吗 另外,我在不久前看到了一个教程,该教程用于在re

我再次尝试OpenGL,我想知道如何设计稍后呈现的类。现在,只有一种类型的形状,因此我创建了一个带有静态VAO成员的类
Shape
,当创建
Shape
的第一个实例时,
glgenvertexarray(1,&VAO)
被调用。现在有一个方法
void Shape::render()

这是个好办法吗?我的意思是,当实际程序中绘制了
Shape
的所有实例时,会反复调用bind
Shape::vao
,但我猜如果
vao
当前已绑定,它实际上不会做任何事情。那猜测正确吗

另外,我在不久前看到了一个教程,该教程用于在
render()
的末尾调用
glBindVertexArray(0)
。当有许多形状时,这不是一个潜在的性能损失吗

但我的猜测是,如果vao是 目前已绑定。那猜测正确吗

对。就正确性而言,重新绑定已经绑定的东西不是问题

不过,这可能会增加一点性能损失。在这种情况下,一个合理的GL实现可能做不了什么,但是您仍然需要调用GL库,并且它必须找到线程的当前上下文,然后才有可能什么都不做。因此,如果您将当前VAO缓存在您的一侧,并且只有在GL发生实际更改时才调用它,那么您的情况可能会更好。但这是只有分析/基准测试才能告诉你的。如果您有数千个甚至数百万个实例,这可能会成为一个真正的问题-哦,如果每个实例都有一个单独的绘制调用,那么您就更糟了-在这种情况下,您应该研究实例渲染

还有,我前段时间看过一个教程 glBindVertexArray(0)位于render()的末尾。那不是个好主意吗 当存在多个形状时,是否存在潜在性能损失

对。大多数教程这样做是为了“清洁”,但在大多数情况下,这确实是浪费时间。如果您可以(并且实际上打算)在“未绑定”状态下执行某些操作(如FBO 0,它只是默认的帧缓冲区),则解除绑定某些GL对象只是一个有用的操作。对于VAO,在核心配置文件中,VAO 0是完全无用的,在任何情况下都必须先绑定一个,然后才能进行绘制-因此,解除任何其他中间绑定都不会赢得任何东西

但我的猜测是,如果vao是 目前已绑定。那猜测正确吗

对。就正确性而言,重新绑定已经绑定的东西不是问题

不过,这可能会增加一点性能损失。在这种情况下,一个合理的GL实现可能做不了什么,但是您仍然需要调用GL库,并且它必须找到线程的当前上下文,然后才有可能什么都不做。因此,如果您将当前VAO缓存在您的一侧,并且只有在GL发生实际更改时才调用它,那么您的情况可能会更好。但这是只有分析/基准测试才能告诉你的。如果您有数千个甚至数百万个实例,这可能会成为一个真正的问题-哦,如果每个实例都有一个单独的绘制调用,那么您就更糟了-在这种情况下,您应该研究实例渲染

还有,我前段时间看过一个教程 glBindVertexArray(0)位于render()的末尾。那不是个好主意吗 当存在多个形状时,是否存在潜在性能损失

对。大多数教程这样做是为了“清洁”,但在大多数情况下,这确实是浪费时间。如果您可以(并且实际上打算)在“未绑定”状态下执行某些操作(如FBO 0,它只是默认的帧缓冲区),则解除绑定某些GL对象只是一个有用的操作。对于VAO,在核心配置文件中,VAO 0是完全无用的,在任何情况下都必须先绑定一个,然后才能进行绘制-因此,解除任何其他中间绑定都不会赢得任何东西

void Shape::render()
{
  glBindVertexArray(vao);
  glDrawArrays(GL_TRIANGLES, foo, bar);
}