draw* 函数的直接状态访问?

Direct state access for draw* functions?

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

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

我还有电话吗

glBindVertexArray(vao);
glDrawArrays(..);

或者有其他方法吗?

glDraw* 只是告诉 OGL 在当前上下文下绘制一些东西,并且可能与许多状态相关,例如 Shader、Blender、VBO/VAO、Z/Stencil、Texture 等。即使是微小的变化也可能带来不同的渲染结果,所以你可以想象 DSA glDraw* 将是一个长函数参数列表,这不好。比如你想把cull face从CW改成CCW,可能你需要在一个长函数调用中找到对应的参数,然后改变它。注意,OGL最像C语言,函数的默认参数特性有限,每次调用DSA glDraw*,都需要一个很长的函数调用,大多数相同的值,那会让你抓狂的。

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

谢谢 一个