Как получить доступ к контексту рендеринга OpenGL на Android с Delphi XE5?
Как создать контекст рендеринга OpenGL на устройстве Android при разработке приложения с Delphi XE5?
По сути, я не знаю с чего начать. Еще нет примеров OpenGL.
То, что я ожидал бы существовать:
Некоторое событие (Panel.OnRender), которое предоставило бы существующий контекст, в котором я мог бы вызывать вызовы OpenGL.
Универсальный элемент управления TOpenGLSurface, который можно поместить в конструктор форм
Способ создания контекста на главной форме во время выполнения.
Из моих исследований до сих пор я TWindowManager.Render
имеет доступ к вызовам OpenGL и использует их для отображения всплывающих окон.
РЕДАКТИРОВАТЬ: Добавление таймера в форму и вызов этой процедуры заполняет экран зеленым цветом, что означает, что контекст GL уже существует:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
glClearColor(0, 1, 0, 0);
glClear(GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
eglSwapBuffers(TCustomAndroidContext.SharedDisplay, TCustomAndroidContext.SharedSurface);
end;
Вопрос в том, как правильно с этим справиться, потому что рендеринг на Timer в контролируемой среде - определенно плохая идея.
1 ответ
Я собираюсь добавить к этому ответу, как новые детали раскрыть.
Попытка 1
Добавление таймера в форму и вызов этой процедуры заполняет экран зеленым цветом, что означает, что контекст GL уже существует:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
glClearColor(0, 1, 0, 0);
glClear(GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
eglSwapBuffers(TCustomAndroidContext.SharedDisplay, TCustomAndroidContext.SharedSurface);
end;
Конечно, рендеринг на Timer в контролируемой среде - определенно плохая идея. Приложение продолжало мигать при сворачивании / уменьшении.
Попытка 2
Я переопределил TContextAndroid
класс (сделал копию модуля Delphi и поместил ее в папку моего приложения). Я смог ввести пользовательский код в DoEndScene
метод, и он успешно выполнил его - для этого теста просто glClear(GL_COLOR_BUFFER_BIT);
, Это заполнило всю область применения цветом. На этот раз приложение не мерцало и вело себя как обычно.
Попытка 3
Вот код, который заставил его работать и который не выглядит хакерским:
types
TMyForm = class(TForm3D)
procedure Form3DRender(Sender: TObject; Context: TContext3D);
end;
implementation
//Event handler for TForm.OnRender
procedure TMyForm.Form3DRender(Sender: TObject; Context: TContext3D);
begin
glClearColor(1, 1, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
end;