我正在通过Superbible和互联网学习OpenGL,并且我经常看到造成麻烦的一个概念是glBindxxx(例如,请参阅Concept behind OpenGL's 'Bind' functions对与绑定有关的典型问题的接受答案。)如何获取所有当前的OpenGL绑定
您可以/必须先将缓冲区(glBindBuffer)绑定,然后再将它们设置为由glVertexAttribPointer使用。在设置glVerteyAttribPointer之前,您可以/必须绑定VAO(glBindVertexArray),等等,以及永不结束的当前绑定依赖关系链。
有时候,即使你忘记了绑定的东西,如果它的程序足够简单,你的程序仍然可以工作,但是我看到很多人花费太多时间来发现他们的bug的来源是他们不知道的一些隐藏绑定的。
在OpenGL中是否有命令列出最后一个绑定?类似的东西来glGetAllBindings,这将返回各自glBindxxx功能的最后绑定ID(其中的一小列表如下基于OpenGL超级第六版)
glBindBuffer glBindBufferBase glBindFrameBuffer glBindImageTexture glBindProgramPipeline glBindSampler glBindTexture glBindTransformFeedback glBindVertexArray glBindVertexBuffer
例如,如果我用缓冲液ID 2,glBindVertex进行glBindBuffer用缓冲液1 ID作为参数,然后再ID为3的数组,然后是ID为5的glBindVertexArray,该函数将为glBindBuffer返回2,为glBindVertexArray返回5。
因此,我可以始终知道在应用新设置之前,在哪种情况下。
我相信这会对需要理解和调试绑定问题的人有很大的帮助。
这些绑定问题可以通过使用直接状态访问完全避免。这是GL 4.5的一项核心功能,并且多年来一直得到NVIDIA和AMD专有驱动程序的支持。使用DSA,您不会为了修改某个对象的状态而断开以前的绑定。 –