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进行渲染绝对是一个坏主意.
随着新细节的揭示,我将附加到这个答案。
尝试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)
归档时间: |
|
查看次数: |
1973 次 |
最近记录: |