我对客户端的旧OpenGL程序进行了一些修改,我很惊讶地看到wglsharelists被用来在两个上下文之间共享列表,并对它们进行不同的多重采样。基本上是:
context1:=tcontext.create(multisample0x);
context2:=tcontext.create(multisample16x);
wglsharelists(context1,context2);
我对wglsharelists的理解是,它只能用于相同的像素格式,并且它们不相同,每个multisample_level都有不同的wglchoosepixelformatarb结果。
所以问题是,是什么给出的? http://msdn.microsoft.com/en-us/library/windows/desktop/dd374390%28v=vs.85%29.aspx说"共享显示列表的所有渲染上下文必须使用相同的像素格式。否则结果取决于所使用的OpenGL的实现。"。难道这些机器的OpenGL实现恰好支持这一点,或者wglsharelists通常在像素格式之间工作,否则它们的multisample_level除外?
编辑:想想看,最近我在家用电脑上安装了一个视频游戏,我记得当我进入选项并更改了multisample_level时,我可以看到更改正在进行,而无需重新加载纹理不同的pixelformat。那么,我是世界上最后一个发现这是标准的人吗?
答案 0 :(得分:0)
正如我从您最新的编辑中所理解的那样,您的问题是您需要一个共享上下文来备份您的OpenGL资源,以便它们能够在更改窗口的像素格式后继续存在。如果您绘制多重采样的FBO附件并完全忽略默认帧缓冲区(窗口)的像素格式,则可以完全消除这种情况。
您可以使用glBlitFramebuffer (...)
将消除锯齿的结果(解析,技术上讲)复制到默认的帧缓冲区中。与现在创建具有特定多重采样像素格式的窗口相比,这是非常受欢迎的,因为您可以动态更改帧缓冲区中的样本数量,而无需触及任何特定于平台的构造。