Для чего используется параметр PIXELFORMATDESCRIPTOR в SetPixelFormat ()? - PullRequest
10 голосов
/ 29 марта 2010

Обычно при настройке контекстов OpenGL я просто заполнял структуру PIXELFORMATDESCRIPTOR необходимой информацией и вызывал ChoosePixelFormat (), после чего вызывался метод SetPixelFormat () с возвращенным совпадающим пиксельным форматом из ChoosePixelFormat (). Затем я просто передал начальный дескриптор, не задумываясь о том, почему.

Но теперь я использую wglChoosePixelFormatARB () вместо ChoosePixelFormat (), потому что мне нужны некоторые расширенные черты, такие как sRGB и мультисэмплинг. Он принимает список атрибутов целых чисел, как XLib / GLX в Linux, а не структуру PIXELFORMATDESCRIPTOR. Итак, мне действительно нужно заполнить дескриптор для использования SetPixelFormat ()? Для чего SetPixelFormat () использует дескриптор, если у него уже есть индекс дескриптора пиксельного формата? Почему я должен указывать одинаковые атрибуты формата пикселя в двух разных местах? И какой из них имеет приоритет; список атрибутов для wglChoosePixelFormatARB () или атрибуты PIXELFORMATDESCRIPTOR, переданные в SetPixelFormat ()?

Вот прототипы функций, чтобы прояснить вопрос:

/* 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 Ответ

4 голосов
/ 30 марта 2010

Полагаю, вам не нужно будет использовать PIXELFORMATDESCRIPTOR и ChoosePixelFormat, просто используйте wglChoosePixelFormatARB и установите возвращаемое значение int как pixelformat. Эти функции используются только для запроса окон на соответствие формата пикселей, функция SetPixelFormat не имеет представления, какую функцию вы использовали для получения желаемого формата пикселей.

Вывод из обсуждения ниже:

Я изучил реализацию Wine в opengl, они полностью игнорируют этот параметр .. ( internal_SetPixelFormat ), но кто знает, что с ним делает ms, единственный безопасный способ, который я вижу, - это найти pixelformat с функцией wglChoosePixelFormatARB и затем используйте DescribePixelFormat, чтобы заполнить структуру, которую вы передаете в SetPixelFormat.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...