Как получить доступ к контексту рендеринга 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;
Другие вопросы по тегам