¿Cómo acceder al contexto de renderizado de OpenGL en Android con Delphi XE5?

¿Cómo crear el contexto de renderizado OpenGL en el dispositivo Android al desarrollar una aplicación con Delphi XE5?

Básicamente no sé por dónde empezar. Todavía no hay ejemplos de OpenGL.

Lo que yo esperaría que existiera:

  • Algún tipo de evento (Panel.OnRender) que proporcionaría un contexto existente en el que podría llamar llamadas OpenGL.

  • Control genérico de TOpenGLSurface que podría colocarse en el diseñador de formularios

  • Una forma de crear contexto en el formulario principal en tiempo de ejecución.

De mi investigación hasta ahora que TWindowManager.Render tiene acceso a las llamadas OpenGL y los utiliza para hacer ventanas emergentes.

EDIT: Añadir un temporizador a un formulario y llamar a este procedimiento llena la pantalla con verde, por lo que significa que el contexto GL ya está allí:

 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; 

La pregunta es – cómo manejar adecuadamente, cos renderizado en Timer en entorno controlado es definitivamente una mala idea.

Voy a añadir a esta respuesta como revelan nuevos detalles.

Intento 1

Agregar un temporizador a un formulario y llamar a este procedimiento llena la pantalla con verde, por lo que significa que el contexto GL ya está allí:

 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; 

Por supuesto, la renderización de Timer en un entorno controlado es definitivamente una mala idea. La aplicación siguió parpadeando en minimizar / maximizar.


Intento 2

He anulado la clase de TContextAndroid ( TContextAndroid hecho una copia de la unidad de Delphi y la he puesto en mi carpeta de la aplicación). Podía inyectar el código de encargo en el método de DoEndScene y lo ha ejecutado con éxito – para esta prueba apenas un glClear(GL_COLOR_BUFFER_BIT); simple glClear(GL_COLOR_BUFFER_BIT); . Esto ha llenado el área de aplicación entera con color. Esta vez la aplicación no parpadeó y se comportó como normal.


Intento 3

Aquí está el código que hizo que funcione y que no parece hacky:

 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 gl abierto más lento que la tela?
  • Pasar atributos personalizados a un shader de fragmentos personalizado
  • Android Surfaceview Crash sin salida de error
  • Android Opengl ES Número máximo de texturas
  • Problema de renderizado de malla libgdx
  • ¿La mejor manera de tener una superposición de zoom y pan en Android?
  • Buscando un método multiplataforma para gráficos básicos 2D / 3D para iOS y Android
  • Está llamando libgdx SpriteBatch método de inicio y fin varias veces caro?
  • Uso seguro de glMapBufferRange () en Android / Java
  • OpenGL ES profundidad buffer android, no puede llegar a trabajar
  • Utilizar ColorMatrix o HexColor en BlendModeFilter - Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.