#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
— Direct2dFMX.Canvas.GDIP.pas
— GDIFMX.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);
вызов.