如何在Delphi XE5中访问Android上的OpenGL渲染环境?

13

如何在使用 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;

问题是如何正确处理它,因为在受控环境中定时器渲染绝对是一个坏主意。

1个回答

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 以下是使其工作且看起来不像黑客的代码:
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;

你需要使用单位 FMX.Types3D、Androidapi.Gles;其他可能有用的单位包括:FMX.Platform.Android、Androidapi.Gles2、Androidapi.JNI.OpenGL; - Jim McKeeth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接