既然我们有直接的状态访问,我想知道为什么没有更新的glDraw * DSA函数。
例如glDrawArrays
依赖于当前的VAO,为什么没有glNamedDrawArrays
?
我还有电话吗
glBindVertexArray(vao);
glDrawArrays(..);
还是有另一种方式吗?
答案 0 :(得分: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调用。
由于 一个