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

标签 opengl

既然我们可以直接访问状态,我想知道为什么没有更新的 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/

相关文章:

java - 我应该选择哪个 OpenGL 版本来满足我的需求?

c++程序编译错误,找不到/访问文件

c++ - 在OpenGL中生成超椭球面

opengl - GLU NURBS - 如何设置控制点权重?

c++ - OpenGL 优化网格绘制(VAO?没有索引?)

opengl - 绑定(bind)Framebuffer还是设置ReadBuffer?

opengl - PyOpenGL headless (headless)渲染

opengl - 使用 block 索引作为 UniformBufferObject、ShaderStorageBufferObjects 等的绑定(bind)点是否安全?

image - Opengl 纹理和字节顺序

c++ - OpenGl表面和纹理