OpenGL в Delphi

       

Подробнее о заголовочном файле opengl. pas


Вместе с Delphi версии три и выше поставляется заголовочный файл, позволяющий подключать библиотеку OpenGL к проектам Delphi. Этот файл содержит только прототипы используемых функций и процедур, сами функции и процедуры размещены в соответствующих файлах DLL.
Например, в секции interface заголовочного файла содержится следующее forward-описание использованной нами во всех предыдущих примерах процедуры:

procedure glClearColor (red, green, blue, alpha: GLclampf); stdcall;

В секции implementation модуля собственно описание процедуры выглядит так:

procedure glClearColor; external opengl32;

Служебное слово stdcall, указанное для всех процедур и функций в этом модуле, означает стандартный вызов функции или процедуры и определяет некоторые правила обмена данными между приложением и библиотекой: как передаются параметры (через регистры или стек), в каком порядке перечисляются параметры и кто, приложение или библиотека, очищает области после их использования.
Служебное слово external указывается для функций, подключаемых из библиотек. После него следует указание имени подключаемой библиотеки. Здесь opengl32 - константа, определяемая, как я отмечал раньше, в другом модуле - в windows. pas:

opengl32 = 'opengl32. dll1;

Константа, соответствующая второй используемой библиотеке, содержится в модуле opengl.

pas:
const
glu32 = 'glu32. dll';

Содержательная часть модуля opengl, соответствующая его инициализации, содержит единственную строку:

Set8087CW($133F);

В справке по этой процедуре можно прочитать, что она служит для включения/выключения исключений при проведении операций с плавающей точкой. Здесь же отмечается, что для OpenGL рекомендуется эти исключения отключать.
Разброс описаний констант и некоторых функций и процедур по разным модулям объясняется тем, напомню, что информация, относящаяся к реализации OpenGL под Windows, помещена в заголовочный файл windows pas Это логично и объяснимо, но в некоторых случаях может вызвать дополнительные проблемы, например, при использовании альтернативных заголовочных файлов или библиотек.
Далее мы встретимся с ситуациями, когда выяснится, что в стандартном модуле, поставляемом с Delphi, не окажется прототипов многих полезных команд. Там же попробуем найти объяснение этому факту.
Альтернативные заголовочные файлы, разработанные некоторыми сторонними организациями или энтузиастами, оказываются более полными в этой части и поэтому полезны в некоторых ситуациях, но из-за того, что модуль windows pas уже содержит описание некоторых процедур, связанных с OpenGL, могут возникнуть накладки.
Следующая возможная ситуация - использование других, нежели производства фирмы Microsoft, библиотек, например, версии OpenGL фирмы SGI, которую отличают более высокие скоростные характеристики по некоторым показателям. В приложении "OpenGL в Интернете" я указал адрес, по которому вы можете найти ее дистрибутив Правда, эту версию OpenGL имеет смысл использовать только на компьютерах, не оснащенных акселератором, поскольку она не может самостоятельно использовать драйверы ICD и MCD, а переадресует все вызовы в Microsoft OpenGL, чем сводятся на нет все ее достоинства В свое время SGI обещала в следующей версии устранить этот недостаток, однако планы этой корпорации по поддержке операционной системы Windows и сотрудничеству с Microsoft, по-видимому, изменились, так что эта работа, возможно, не будет завершена.
Если вам потребуется модифицировать заголовочные файлы для подключения другой библиотеки, то придется учитывать несколько нюансов, связанных с версиями используемой Delphi.
Здесь я смогу только обозначить эти тонкости Хотя я и нашел решение проблемы подключения других версий OpenGL, но не имею возможности поделиться им - файл windows pas даже в сжатом виде имеет очень большой размер, поэтому на одной дискете модифицированные версии этого файла не разместить (для всех версий Delphi).
Первое, с чего надо начать, - это изменить значения констант opengl32 и glu32 в заголовочных файлах и установить имена соответствующих файлов библиотек. Если вас не страшит то, что модифицируются стандартные модули Delphi, можете сразу компилировать проекты Если же вы модифицируете копии стандартных модулей, то придется учитывать, что почти каждый из стандартных модулей Delphi в списке uses подключает модуль windows, и, возможно, придется переставлять порядок модулей в списке uses.
Обязательно посмотрите с помощью утилит быстрого просмотра или tdump заголовочную информацию откомпилированного приложения для того, что-бы убедиться, что оно использует только те библиотеки, которые подразумевались При наличии нескольких библиотек невозможна ситуация, когда функции берутся вперемешку из разных библиотек.
Если используется только одна определенная библиотека, но контекст воспроизведения оказывается невозможным получить, попробуйте явным образом заполнять формат пиксела, указывая требуемые значения для каждого поля - это может помочь
В приложении "OpenGL в Интернете" я указал адреса, по которым вы можете получить свободно распространяемые заголовочные файлы независимых разработчиков, более полные, чем стандартный модуль Ими можно воспользоваться и в том случае, если у вас не получится самостоятельно подключать другие версии OpenGL.



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