我正在用OpenGL 3.2+编写引擎。可渲染对象具有网格(a.k.a VAO)和几种材质(a.k.a着色器和程序)。所有渲染都存储在渲染队列中,渲染队列对材质和网格物体上的渲染过程进行排序,以便需要最少的OpenGL绑定调用。
但是,有时它会绑定已经绑定的对象,我的问题是:OpenGL是否会在您尝试绑定已经绑定的对象时自动检测到它是否会跳过所有昂贵的操作,或者您是否必须实现一个系统来检测对象是否已被绑定?
如果OpenGL没有检测到这一点,通过glGet *获取对象名称可能会更快,并且与您尝试绑定的对象进行比较,或者只是自己跟踪当前绑定的对象吗?
答案 0 :(得分:1)
我不相信规范要求执行此类检查,但每个主要实现都会这样做。但是,如果您决定自己做 - 为什么不自己存储价值? glGet在这里没有特别的兴趣。顺便说一句,材质和着色器是不一样的。
答案 1 :(得分:0)
通常,当您启用某些内容时,您需要在不需要它之后将其禁用。因此答案是:你必须跟踪程序中的内容。
我能想到的最简单的例子是:
glEnable(GL_TEXTURE_2D);
glBindTexture( 0, id );
// render
glDisable(GL_TEXTURE_2D);