题
我有一个未定义的显示上下文数,每个都会显示一个纹理。当我调用glGenTextures时,我会在所有显示上下文中返回相同的名称。这会有用吗?即使它们具有相同的名称,它们仍会存储和显示不同的纹理吗?如果不是应该做些什么来解决这个问题?
解决方案
从glGenTexture获取相同的名称并显示相同的纹理并不是一回事。
纹理名称只是上下文自行决定的整数,通常从1开始,并随每个glGenTexture递增,但不一定如此。一个实现不需要这样工作(尽管大多数都这样)。然而,理论上你也可以或多或少地“随机”地获得“随机”。数字,例如,对于任何类型的对象(即,不仅仅是纹理,还有缓冲区和着色器)递增的整数,或甚至是驱动程序的地址空间中的32位指针地址,或其他一些其他的东西。不要求名称必须是特定的名称。
在传统的OpenGL中,您甚至可以自己编写名称而不是使用glGenTexture,但现在已经不再合法了。我不确定他们在允许的时候会怎么想,但无论如何......:)
不同上下文中的相同数字(名称)通常是不同的纹理,或者可能根本没有纹理。因此,如果您确实在具有相同纹理名称的不同上下文中看到相同的纹理,那么您要么具有共享上下文,要么驱动程序是错误的。
请注意,如果使用wglCreateContextAttribsARB,则第二个参数是已存在上下文的句柄(或null)。如果您在此处提供上下文句柄,则即使没有显式调用glShareLists,您也将拥有共享上下文。也许这就是偶然发生的事情。
其他提示
纹理不是(默认情况下)跨上下文共享 - 您必须明确启用它,但是如何执行此操作是特定于平台的。
在win32上,它是 wglShareLists
,在大多数其他平台上,它是在您创建上下文时指定的(例如,使用 share
参数到 aglCreateContext
在OS-X上。
据我所知,我没有启用任何纹理共享。但是,所有显示上下文都显示相同的纹理。