SetPixelFormat() 中的 PIXELFORMATDESCRIPTOR 参数是做啥用的?

Posted

技术标签:

【中文标题】SetPixelFormat() 中的 PIXELFORMATDESCRIPTOR 参数是做啥用的?【英文标题】:What is the PIXELFORMATDESCRIPTOR parameter in SetPixelFormat() used for?SetPixelFormat() 中的 PIXELFORMATDESCRIPTOR 参数是做什么用的? 【发布时间】:2010-03-29 18:51:16 【问题描述】:

通常在设置 OpenGL 上下文时,我只需使用必要的信息填写 PIXELFORMATDESCRIPTOR 结构并调用 ChoosePixelFormat(),然后使用从 ChoosePixelFormat() 返回的匹配像素格式调用 SetPixelFormat()。然后我只是简单地传递了初始描述符,而没有考虑太多原因。

但现在我使用 wglChoosePixelFormatARB() 而不是 ChoosePixelFormat(),因为我需要一些扩展特性,例如 sRGB 和多重采样。它采用整数的属性列表,就像 Linux 上的 XLib/GLX 一样,而不是 PIXELFORMATDESCRIPTOR 结构。那么,我真的必须填写一个描述符供 SetPixelFormat() 使用吗?当 SetPixelFormat() 已经具有像素格式描述符索引时,它使用描述符做什么?为什么我必须在两个不同的地方指定相同的 pixelformat 属性?哪个优先; wglChoosePixelFormatARB() 的属性列表,还是传递给 SetPixelFormat() 的 PIXELFORMATDESCRIPTOR 属性?

为了让问题更清楚,这里是函数原型:

/* Finds a best match based on a PIXELFORMATDESCRIPTOR,
and returns the pixelformat index */
int ChoosePixelFormat(HDC hdc, const PIXELFORMATDESCRIPTOR *ppfd);

/* Finds a best match based on an attribute list of integers and floats,
and returns a list of indices of matches, with the best matches at the head.
Also supports extended pixelformat traits like sRGB color space,
floating-point framebuffers and multisampling. */
BOOL wglChoosePixelFormatARB(HDC hdc, const int *piAttribIList,
    const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats,
    UINT *nNumFormats
);

/* Sets the pixelformat based on the pixelformat index */
BOOL SetPixelFormat(HDC hdc, int iPixelFormat, const PIXELFORMATDESCRIPTOR *ppfd);

编辑:MSDN 谈到了 SetPixelFormat() 参数:

指向包含逻辑像素格式规范的 PIXELFORMATDESCRIPTOR 结构的指针。系统的元文件组件使用这种结构来记录逻辑像素格式规范。该结构对 SetPixelFormat 函数的行为没有其他影响。

但我不知道这意味着什么,也不知道它与我的问题有何关系。

【问题讨论】:

【参考方案1】:

我相信您不必使用 PIXELFORMATDESCRIPTOR 和 ChoosePixelFormat,只需使用 wglChoosePixelFormatARB 并将返回的 int 设置为像素格式。这些函数仅用于查询窗口以匹配像素格式,SetPixelFormat 函数不知道您使用哪个函数来获得所需的像素格式。

以下讨论的结论:

我研究了 Wine 的 opengl 实现,他们完全忽略了该参数.. (internal_SetPixelFormat),但谁知道 ms 用它做什么,我看到的唯一安全方法是使用 wglChoosePixelFormatARB 函数查找像素格式,然后使用DescribePixelFormat 填写您传递回 SetPixelFormat 的结构。

【讨论】:

是的,wglChoosePixelFormatARB 取代了 ChoosePixelFormat,毫无疑问。但是 SetPixelFormat 仍然需要一个 PIXELFORMATDESCRIPTOR。这就是我困惑的根源。所以你最终得到一个 PIXELFORMATDESCRIPTOR,一个你传递给 wglChoosePixelFormatARB 的整数属性列表。 抱歉,我错过了那个,那可能是它存储有关所选像素格式的信息的地方,您可以通过将其传递给归零结构来测试它。 不,它没有。该类型是指向 const PIXELFORMATDESCRIPTOR 的指针,因此它会读取它。它不写信给它。请参阅我的问题摘要中的函数原型。 您完全正确,我很抱歉没有花更多时间来理解您的问题。我现在也完全被这个参数弄糊涂了。当它应该已经知道有关pixelfomat的所有内容时,为什么还要在某个地方使用/存储结构。我研究了 Wine 的 opengl 实现,他们完全忽略了该参数.. tiny.cc/i11lj (internal_SetPixelFormat),但谁知道 ms 用它做什么,我看到的唯一安全方法是使用 wglChoosePixelFormatARB 函数找到像素格式,然后使用 DescribePixelFormat 来填写您传递回 SetPixelFormat 的结构。 抱歉,我不接受这个答案。你的回答很好,但我仍然对此感到困惑,也想给别人一个机会。我不完全相信使用 DescribePixelFormat 会起作用,因为 PIXELFORMATDESCRIPTOR 无法保存与 wglChoosePixelFormatARB 返回的某些像素格式相同的信息。

以上是关于SetPixelFormat() 中的 PIXELFORMATDESCRIPTOR 参数是做啥用的?的主要内容,如果未能解决你的问题,请参考以下文章

如何快速创建 Pixel_8 缓冲区

像素 Pixel (Picture Element)

在多行表单上关闭键盘 (Pixel2)

Pixel 手机上的 checkLocationSettings 返回 RESOLUTION_REQUIRED

全新 Google Pixel Watch 重磅上线 | 着手为 Wear OS 构建应用!

全新 Google Pixel Watch 重磅上线 | 着手为 Wear OS 构建应用!