绘制*函数的直接状态访问?

Mai*_*ein 2 opengl

既然我们有直接的状态访问,我想知道为什么没有更新的glDraw*DSA函数.

例如glDrawArrays,依赖于当前的VAO,为什么没有glNamedDrawArrays呢?

我还有电话吗?

glBindVertexArray(vao);
glDrawArrays(..);
Run Code Online (Sandbox Code Playgroud)

还是有另一种方式?

Yan*_* An 6

glDraw*只是告诉OGL在当前上下文中绘制一些东西,这可能与Shader,Blender,VBO/VAO,Z/Stencil,Texture等许多状态有关.即使微小的变化也可能带来不同的渲染效果,因此你可以成像DSA glDraw*将是一个很长的函数参数列表,这并不好.例如,您想要将剔除面从CW更改为CCW,可能需要在长函数调用中找到相应的参数,并进行更改.需要注意的是,OGL是最像C的,并且函数的默认参数功能是有限的,每次调用DSA glDraw*时,你需要有一个具有大多数相同值的长函数调用,这会让你发疯.

正如@Andon M. Coleman所提到的,DSA旨在减少一般OGL函数调用类型的调用顺序:bind-> modify-> unbind,而DSA只需要1个API调用.这将减少CPU时间,特别是你有一个非常大的OGL API调用.

谢谢你