Подтвердить что ты не робот

Как получить доступ к контексту рендеринга OpenGL на Android с помощью Delphi XE5?

Как создать контекст рендеринга OpenGL на устройстве Android при разработке приложения с помощью Delphi XE5?

В принципе, я не знаю с чего начать. Пока еще нет примеров OpenGL.

Что я ожидаю существовать:

  • Некоторое событие (Panel.OnRender), которое предоставило бы существующий контекст, в котором я мог бы называть вызовы OpenGL.

  • Общий контроль над тегами, который можно поместить в конструктор форм

  • Способ создания контекста в основной форме во время выполнения.

Из моих исследований до сих пор я, что TWindowManager.Render имеет доступ к вызовам OpenGL и использует их для отображения всплывающих окон.

EDIT: Добавление таймера в форму и вызов этой процедуры заполняет экран зеленым цветом, поэтому контекст 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 в контролируемой среде определенно плохая идея.

4b9b3361

Ответ 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;

Конечно, рендеринг по таймеру в контролируемой среде определенно плохая идея. Приложение постоянно мерцало при минимизации/максимизации.


Попытка 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;