如何使用Delphi XE5在Android上访问OpenGL渲染上下文?

Kro*_*ica 13 delphi android opengl-es delphi-xe5

在使用Delphi XE5开发应用程序时,如何在Android设备上创建OpenGL渲染上下文?

基本上我不知道从哪里开始.还没有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;
Run Code Online (Sandbox Code Playgroud)

问题是 - 如何正确处理它,在受控环境中对Timer进行渲染绝对是一个坏主意.

Kro*_*ica 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;
Run Code Online (Sandbox Code Playgroud)

当然,在受控环境中在计时器上渲染绝对是一个坏主意。该应用程序在最小化/最大化时不断闪烁。


尝试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;
Run Code Online (Sandbox Code Playgroud)