我有一个问题,当我破坏openGL上下文并稍后重新创建它并调用glGenTextures
时,它已经给了我已经过去的id(s)。这是一个问题,因为这些ID可能仍然分配给一些纹理包装器,这些纹理包装器在某些后台线程中还没有时间调用glDeleteTextures
。因此,当这些后台线程调用glDeleteTextures
时,它们将删除新纹理:(
即使在删除/重新创建OpenGl上下文后,强制glGenTextures
也始终自动递增?
答案 0 :(得分:1)
没有。您无法更改OpenGL API实现。
通过不删除上下文直到完成所有使用它的操作,无论线程使用该上下文,都可以轻松解决问题。
顺便说一下,删除和重新创建上下文是很昂贵的。我没有理由这样做。
答案 1 :(得分:1)
无法使OpenGL上下文记住哪个对象命名了最后使用的上下文。但是,这并不意味着你无法记住哪些名称与哪些上下文有关。这很容易。
每个要删除的纹理对象都应该有两条信息:纹理名称(整数)和表示创建对象的上下文的值。当你去删除那个纹理时,你首先检查上下文是否与创建它的上下文相同。如果没有,那么你就把它放在地板上。
最简单的方法是让每次创建上下文时都会增加一个原子整数。每次创建纹理时,您还应该获得与其一起的上下文整数。删除纹理时,如果纹理中的整数上下文与当前上下文不匹配,则不要删除它。
答案 2 :(得分:-1)
调用glGenTextures返回的纹理名称不会被后续调用返回,除非它们首先使用glDeleteTextures删除。
因此您无法获得仍在使用的ID。