使用 Mesa OpenGL 获取带有模板缓冲区的 pixelformat/context

Getting a pixelformat/context with stencil buffer with Mesa OpenGL

我需要更改一个非常旧的应用程序才能通过远程桌面连接(它只支持 opengl 1.1 的一个子集)工作。它只需要各种 opengl 1.x 函数,所以我尝试使用将 mesa opengl32.dll 文件放置在应用程序文件夹中的技巧。该应用程序仅很少使用 opengl,因此可以使用低性能软件渲染器。

无论如何,我从 https://wiki.qt.io/Cross_compiling_Mesa_for_Windows 获得了预编译的 mesa opengl32.dll 文件,但我无法获得启用模板缓冲区的 pixelformat/context。如果我禁用模板缓冲区使用,那么其他一切都可以正常工作,但如果我能弄清楚如何在启用模板缓冲区的情况下获得 pixelformat/context ,那将是最好的。

这是上下文创建代码的像素格式部分:

function gl_context_create_init(adevice_context:hdc):int;
var
 pfd,pfd2:tpixelformatdescriptor;
begin
 mem_zero(pfd,sizeof(pfd));
 pfd.nSize:=sizeof(pfd);
 pfd.nVersion:=1;
 pfd.dwFlags:=PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
 pfd.iPixelType:=PFD_TYPE_RGBA;
 pfd.cColorBits:=32;
 pfd.iLayerType:=PFD_MAIN_PLANE;
 pfd.cStencilBits:=4;

 gl_pixel_format:=choosepixelformat(adevice_context,@pfd);
 if gl_pixel_format=0 then
  gl_error('choosepixelformat');
 if not setpixelformat(adevice_context,gl_pixel_format,@pfd) then
  gl_error('setpixelformat');
 describepixelformat(adevice_context,gl_pixel_format,sizeof(pfd2),pfd2);
 if ((pfd.dwFlags and pfd2.dwFlags)<>pfd.dwFlags) or
     (pfd.iPixelType<>pfd2.iPixelType) or
     (pfd.cColorBits<>pfd2.cColorBits) or
     (pfd.iLayerType<>pfd2.iLayerType) or
     (pfd.cStencilBits>pfd2.cStencilBits) then
  gl_error('describepixelformat');

 ...
end;

错误发生在行 (pfd.cStencilBits>pfd2.cStencilBits),我似乎无法通过 mesa 找到 cStencilBits 不为 0 的像素格式,所以我无法获得上下文支持模板。

事实证明 choosepixelformat 不能选择只能通过 mesa 可用的像素格式 opengl32.dll 然而,wglchoosepixelformat 可以选择只能通过 mesa 可用的像素格式,所以我的问题解决了,因为我现在能够在使用这个旧程序的远程桌面连接时让模板缓冲区工作。

我不明白但没有时间研究的事情(如果你知道答案,请 post 在这个答案的评论中),setpixelformat 和 descrippixelformat 都工作得很好可以通过 mesa 使用像素格式。我希望 choosepixelformat/setpixelformat/describepixelformat 中的所有 3 个都能正常工作或全部不工作,但事实就是如此。