既然我们可以直接访问状态,我想知道为什么没有更新的 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 调用。
谢谢
一个
关于opengl - draw* 函数的直接状态访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27790908/