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;

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

4

1 回答 1

3

随着新的细节显示,我将附加到这个答案。

尝试 1

将 Timer 添加到表单并调用此过程会使屏幕充满绿色,这意味着 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 渲染绝对是个坏主意。该应用程序在最小化/最大化时不断闪烁。


尝试 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;
于 2013-09-30T19:53:51.150 回答