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