在使用 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 上渲染绝对不是一个好主意。
最佳答案
我将在新的详细信息显示时附加到此答案。
尝试 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;
当然,在受控环境中在 Timer 上渲染绝对不是一个好主意。该应用程序在最小化/最大化时一直闪烁。
尝试 2
我已经覆盖了 TContextAndroid
类(制作了 Delphi 单元的副本并将其放入我的应用程序文件夹中)。我能够将自定义代码注入(inject) 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;
关于android - 如何使用 Delphi XE5 在 Android 上访问 OpenGL 渲染上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18856428/