【问题标题】:Direct state access for draw* functions?draw* 函数的直接状态访问?
【发布时间】:2015-01-06 14:38:46
【问题描述】:

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

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

我还有电话吗

glBindVertexArray(vao);
glDrawArrays(..);

或者还有其他方法吗?

【问题讨论】:

  • 我认为您可能过度考虑了 DSA。如果你想实现一个零副作用的绘图命令,它还必须使用 GLSL 程序的句柄,这样你就不必调用glUseProgram (...),一个绑定到每个图像单元的纹理数组和很快。 DSA 更适合在不绑定对象的情况下更改对象状态。

标签: opengl


【解决方案1】:

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 调用。

谢谢 一个

【讨论】:

  • 多参数函数不是借口:没有人阻止您将结构作为参数传递,也许通过一些“glInitState”函数对其进行初始化。
  • OGL 上下文和这个结构的区别在于不同的线程可以将它们的结构传递给 API 函数而不需要任何锁,而上下文通常是共享的(否则你必须重复资源)。
  • 嗯,多线程是另一个话题,尤其是与 OGL 一起使用,这会使事情变得复杂,;)
猜你喜欢
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2018-01-08
  • 2019-03-24
  • 2017-10-16
  • 1970-01-01
相关资源
最近更新 更多