OpenGL в Delphi

       

Решение проблем


Обратите внимание, что в коде проекта TestPFD я установил несколько проверок на отсутствие ссылки на контекст воспроизведения, который может быть потерян по ходу работы любого приложения, использующего OpenGL - редкая, но возможная ситуация в штатном режиме работы системы и очень вероятная ситуация, если, например, по ходу работы приложения менять настройки экрана. Если значение соответствующей переменной равно нулю, вывод OpenGL оказывается невозможным:

If hrc=0 then ShowMessage('Oтсутствует контекст воспроизведения OpenGL');

Обратите также внимание на следующую важную вещь. В самой первой программе, использующей OpenGL, как и в подавляющем большинстве последующих примеров, процедура установки формата пиксела записана мною в самом коротком варианте:

FillChar {pfd, SizeOf (pfd), 0);
nPixelFormat: =ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);

To есть ни одно из полей pfd я не задаю явно, отдавая все на откуп OpenGL. B некоторых же примерах я ограничиваюсь только заданием необходимых значений для полей битовых флагов.
Я не встречал ситуаций, когда бы такой подход не срабатывал, не считая случаев с использованием других, нежели фирмы Microsoft, версий OpenGL, но поручиться за то, что он будет работать для всех графических карт, не могу. Возможно, проблемы возникнут также из-за некорректной работы Драйверов (стандартная отговорка, не правда ли?).
Если примеры с прилагаемой дискеты у вас не работают, выдавая просто черный экран, начните поиск причины с определения значения hrc сразу жe после создания ссылки на контекст воспроизведения. Если это значение Равно нулю, в процедуре установки формата пиксела задайте всем полям значения согласно полученным с помощью приложения проекта TestPFD.Скорее всего, вам рано или поздно потребуется разрешать подобные проблемы, связанные с неверным форматом пиксела или подобными системными ошибками. Сделать это в проектах, где не используется библиотека классов Delphi, оказывается сложным для новичков. Помощью может стать пример из подкаталога Ex23, где я демонстрирую, как выдать информацию о последней системной ошибке. В программе намеренно сделана ошибка путем превращения строки с получением ссылки на контекст устройства в комментарий.
Функция API FormatMessage позволяет преобразовать сообщение об ошибке в формат, пригодный для вывода:

lpMsgBuf: PChar;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or
FORMAT_MESSAGE_FROM_SYSTEM,
nil, GetLastError(), LANG_NEUTRAL, @lpMsgBuf, 0, nil);
MessageBox(Window, lpMsgBuf, 'GetLastError', MB_OK);

Сообщение выводится в осмысленной форме и на языке, соответствующем локализации операционной системы. В данном случае выводится фраза "Неверный дескриптор".
Если убрать знаки комментария со строки с получением ссылки, а закомментировать строку с вызовом функции setPixelFormat, сообщение об ошибке будет выглядеть как "Неправильный формат точки" (подразумевается "Неверный формат пиксела").
Полный список системных ошибок, связанных с использованием OpenGL, можно посмотреть в файле windows. pas, в разделе "OpenGL Error Code".
Учтите, что в этом примере выводится информация о последней системной ошибке, а она могла произойти задолго до работы приложения, так что следует использовать такую диагностику ошибок только при отладке приложений. Первый аргумент функции API FormatMessage позволяет определять дополнительные детали вывода сообщения.

Замечание
Во второй главе мы познакомимся с еще одним способом диагностирования ошибок, стандартным для OpenGL.



Содержание раздела