通常,在设置OpenGL上下文时,我只是简单地用必要的信息填充了PIXELFORMATDESCRIPTOR结构,并将其命名为ChoosePixelFormat(),然后使用从ChoosePixelFormat()返回的匹配像素格式调用SetPixelFormat()。然后,我只是简单地通过了初始描述符,而没有考虑太多。
但是现在我使用wglChoosePixelFormatARB()而不是ChoosePixelFormat(),因为我需要一些扩展的特征,例如sRGB和多重采样。它采用整数的属性列表,就像Linux上的XLib / GLX一样,而不是PIXELFORMATDESCRIPTOR结构。那么,我真的必须填写描述符以供SetPixelFormat()使用吗?当SetPixelFormat()已经具有pixelformat描述符索引时,该描述符使用什么?为什么必须在两个不同的地方指定相同的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函数的行为没有其他影响。
但是我不知道这意味着什么,或者它与我的问题有什么关系。
最佳答案
我相信您将不必使用PIXELFORMATDESCRIPTOR和ChoosePixelFormat,只需使用wglChoosePixelFormatARB并将返回的int设置为pixelformat。这些函数仅用于查询窗口以查找匹配的像素格式,SetPixelFormat函数不知道您使用哪个函数来获取所需的像素格式。
结论来自以下讨论:
我已经研究了Wine的opengl实现,他们完全忽略了该参数。(internal_SetPixelFormat),但是谁知道ms会对它起作用,我看到的唯一安全的方法是使用wglChoosePixelFormatARB函数查找pixelformat,然后使用DescribePixelFormat进行填充在您传递回SetPixelFormat的结构中。