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