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

Opengl draw*函数的直接状态访问?,opengl,Opengl,既然我们有了直接状态访问,我想知道为什么没有更新的glDraw*DSA函数 例如,glDrawArrays依赖于当前VAO,那么为什么没有glnamedrawArrays 我还有电话吗 glBindVertexArray(vao); glDrawArrays(..); 或者有其他方法吗?glDraw*只是告诉OGL在当前上下文下绘制一些东西,可能与许多状态有关,如着色器、混合器、VBO/VAO、Z/模具、纹理等。。即使是很小的更改也可能会带来不同的渲染结果,所以可以将DSA glDraw*作为

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

例如,
glDrawArrays
依赖于当前VAO,那么为什么没有
glnamedrawArrays

我还有电话吗

glBindVertexArray(vao);
glDrawArrays(..);

或者有其他方法吗?

glDraw*只是告诉OGL在当前上下文下绘制一些东西,可能与许多状态有关,如着色器、混合器、VBO/VAO、Z/模具、纹理等。。即使是很小的更改也可能会带来不同的渲染结果,所以可以将DSA glDraw*作为一个很长的函数参数列表,这并不好。例如,要将cull face从CW更改为CCW,可能需要在长函数调用中找到相应的参数,并对其进行更改。需要注意的是,OGL最像C,函数的默认参数特性是有限的,每次调用DSA glDraw*,您都需要使用大多数相同的值进行长时间的函数调用,这会让您发疯

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

谢谢
我想你可能想得太多了。如果您想要实现一个没有副作用的绘图命令,它还必须使用GLSL程序的句柄,这样您就不必调用
GluseProgramm(…)
,一个绑定到每个图像单元的纹理数组,等等。DSA更适合在不绑定对象的情况下更改对象状态。多参数函数不是借口:没有人阻止您将结构作为参数传递,可能是通过某种“glInitState”进行初始化OGL上下文和此结构之间的区别在于,不同的线程能够将其结构传递给API函数,而不需要任何锁,而传递给上下文的结构通常是共享的(否则您将不得不复制资源)。好吧,多线程是另一个主题,尤其是OGL,这会使事情变得复杂,;)