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