2013-09-17 2 views
13

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

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

Что я ожидал бы существовать:

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

  • Generic управления TOpenGLSurface, которые могут быть размещены в дизайнере форм

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

Из моих исследований до сих пор я, что 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; 

Вопрос - как правильно обращаться с этим, cos rendering on Timer в контролируемой среде - определенно плохая идея.

ответ

3

Я собираюсь добавить этот ответ, когда появятся новые детали.

Покушение 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

Вот код, который сделал это, чтобы работать, и это не выглядит Hacky:

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; 
+0

Вы должны использовать блоки FMX.Types3D, Androidapi.Gles; Другие возможные полезные: FMX.Platform.Android, Androidapi.Gles2, Androidapi.JNI.OpenGL; –