Как настроить среду OpenGL1.4 в приложении Firemonkey?

#delphi #opengl #delphi-xe2 #firemonkey

#delphi #opengl #delphi-xe2 #firemonkey

Вопрос:

В прежние времена я бы создал TForm, разместил на нем TMyPanel (с переопределенным сообщением WM_PAINT) и передал его дескриптор куче функций WGL, которые находят совместимый формат пикселей и создают контекст рендеринга. Точно так же, как это было сделано в NeHe tutorials.

Теперь появляется приложение FireMonkey. Как получить контекст рендеринга OpenGL 1.4, который работает на Win и iOS?

РЕДАКТИРОВАТЬ: Пытался заставить его работать, передавая TForm.Handle (который является NativeUInt). Хорошие новости — нет ошибок со стороны OpenGL, но плохие новости — также нет вывода в TForm.. Я, очевидно, упускаю здесь какую-то важную деталь, у кого-нибудь есть работающий OpenGL в приложении FireMonkey?

Ответ №1:

Firemonkey предоставляет уровень абстракции.

Итак, в Windows вы используете DirectX, а в OSX и iOS — OpenGL / Quartz. В Windows также возможно, что все вернется к GDI

Учитывая это, необходимо учитывать, что местом назначения рендеринга не всегда может быть OpenGL, и оно не всегда может быть одинаковым даже на одной платформе.

TCanvas в части этого уровня абстракции.

В настоящее время существует 3 реализации TCanvas , ваше приложение может использовать любую из них.

  • FMX.Canvas.D2D.pas — Direct2d
  • FMX.Canvas.GDIP.pas — GDI
  • FMX.Canvas.Mac.pas — Mac

Детали реализации платформы обычно скрыты в частных разделах и недоступны.

У вас также есть TPlatform in FMX.Platform.pas , который скрывает детали реализации и публикует единый API (ограниченный по объему), предназначенный для работы на всех платформах.

Если вы используете FMX.Platform.Win.pas , вы можете получить дескриптор Windows для данного TFmxHandle

При использовании FMX.Platform.Mac.pas вы можете получить IObjectiveC для данного TFmxHandle

Однако на IOS нет эквивалентной функции в FMX_Platform_iOS.pas

Комментарии:

1. Ваш ответ хорош, но он пока не позволил мне достичь своей цели. Похоже, что что-то не так с этим TfmxHandle.

Ответ №2:

После некоторых исследований мне удалось создать контекст OpenGL в FireMonkey на платформе Windows. У меня пока нет доступа к iOS, но я уверен, что там тоже можно что-то сделать.

К решению: добавьте предложение FMX.Platform.Win to uses (возможно, потребуется включить его в IFDEF для iOS). Теперь мы можем использовать, FmxHandleToHWND(Form1.Handle) чтобы получить действительный HWND . Вот и все. В macOS то же самое делается путем добавления FMX.Platform.Win и через H_WND := FmxHandleToObjC(AHandle); вызов.