如何获取所有当前的OpenGL绑定

时间:2016-08-08 22:43:39

标签: debugging opengl binding

我正在通过Superbible和互联网学习OpenGL,我总是看到引起麻烦的概念是glBindxxx(例如,参见Concept behind OpenGL's 'Bind' functions对于绑定相关的典型问题的接受答案。)

您可以/必须绑定缓冲区(glBindBuffer),然后再将它们设置为glVertexAttribPointer使用。您可以/必须在设置glVerteyAttribPointer之前绑定VAO(glBindVertexArray),依此类推,使用永不停止的当前绑定依赖链。

有时,即使你忘了绑定一些东西,你的程序可能仍然有效,如果它很简单,但我看到很多人花了太多时间发现他们的bug的来源是一些他们不知道的隐藏绑定

OpenGL中是否有命令列出最后一个绑定?类似于glGetAllBindings的东西,这将返回每个glBindxxx函数的最后一个绑定ID(根据Superbible第6版,它们的下面一小部分列表)

glBindBuffer glBindBufferBase glBindFrameBuffer glBindImageTexture glBindProgramPipeline glBindSampler glBindTexture glBindTransformFeedback glBindVertexArray glBindVertexBuffer

例如,如果我执行一个缓冲区ID为参数的glBindBuffer,然后再使用缓冲区ID 2,glBindVertexArray,ID为3,然后使用ID为5的glBindVertexArray,则函数将为glBindBuffer返回2,为glBindVertexArray返回5。

有了这个,我可以在应用新设置之前知道我在哪种情况下。

我相信这将极大地帮助任何需要理解和调试绑定问题的人。

1 个答案:

答案 0 :(得分:0)

  

OpenGL中是否有命令列出所有当前绑定?

没有。真的,怎么会有?

许多对象绑定到特定类型对象的特定目标。缓冲对象本身就有十几个。并且纹理不仅绑定到目标,它们还绑定到纹理单元目标的组合。因此(单元0,GL_TEXTURE2D)的组合可以具有与(单元0,GL_TEXTURE3D)不同的纹理边界。现代硬件的纹理单元数量必需至少为96(每个阶段16个* 6个着色器阶段)。

让一个功能回归所有这些信息是不合理的。

相关问题