¿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.
- Android OpenGL ES Soporte en todas partes?
- Cómo cargar y mostrar el archivo .obj en Android con OpenGL-ES 2
- ¿Emulador de BlueStacks para Linux?
- Android TextureView / Dibujo / Rendimiento de la pintura
- Fuente de luz dentro de una habitación que actúa inesperadamente
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.
- Android GLSurfaceView con fondo dibujable
- Error al asignar variaciones en dispositivos Samsung
- Guardar textura 2D en un png en Android OpenGL ES
- ¿Usa Android un sistema de ventana personalizado?
- Memoria insuficiente al asignar memoria nativa
- Cómo tratar NaN o inf en los shaders de OpenGL ES 2.0
- La mejor manera de hacer el bucle del juego para Android usando OpengGLSurface
- Filtro esférico en android
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;
- ¿Cuál es el estado actual del cifrado de la aplicación de Android?
- Transferencia de la aplicación de Android con suscripción a otra cuenta