2016-08-08 13 views
0

我正在通过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。

因此,我可以始终知道在应用新设置之前,在哪种情况下。

我相信这会对需要理解和调试绑定问题的人有很大的帮助。

+1

这些绑定问题可以通过使用直接状态访问完全避免。这是GL 4.5的一项核心功能,并且多年来一直得到NVIDIA和AMD专有驱动程序的支持。使用DSA,您不会为了修改某个对象的状态而断开以前的绑定。 –

回答

0

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

不,真的,怎么会有?

许多对象都绑定到该特定类型对象的特定目标。单独的缓冲区对象有十几个。纹理不仅绑定到目标,它们绑定到纹理单元目标的组合。所以(单元0,GL_TEXTURE2D)的组合可以具有与(单元0,GL_TEXTURE3D)不同的纹理限制。现代硬件的纹理单元的数量为,要求至少为96(每个stage * 6着色器阶段为16)。

让单一功能反弹所有这些信息是不合理的。

+0

我看到你理解我想看到所有的绑定,但我想看到所有最后激活的,例如,如果我用glBindBuffer与缓冲区1,该命令会返回我1. – user9589

+1

@ user9589:也许你误解了目标工作。如果将一个缓冲区绑定到'GL_ARRAY_BUFFER',然后绑定到'GL_PIXEL_UNPACK_BUFFER',绑定到'GL_ARRAY_BUFFER'的缓冲区*仍然处于活动状态*。它不会比绑定到像素解压缩的那个活跃。这就是对象模型的工作原理。 –

+0

你能推荐这方面的参考吗?我正在阅读Superbible,但是这里的信息并不是很清楚,但却是一个非常微弱的转折点。我的帖子也试图通过观察当前的绑定而不是试图猜测他们来澄清这一点。 – user9589

相关问题