OpenGL + Python multiplataforma con Kivy

Trasfondo: siendo un programador ingenuo de Chukchi, pensé: "Python es tan multiplataforma, escribiré un juguete para mi hijo, lo ejecutaré en una tableta, lo dejaré jugar". Como resultado, me tomó dos semanas intentar encontrar una solución para pasar de PyOpenGL + pygame a kivy, ya que no encontré un ejemplo claro de uso de OpenGL con kivy. Quizás mi experiencia ayude a alguien a ahorrar tiempo.





Diagrama de proceso de muestra
Diagrama de proceso de muestra

Descargo de responsabilidad:





  1. No insto a nadie a desarrollar aplicaciones en python con gráficos 3D para Android. Ésta no es la opción más inteligente. Pero si realmente lo desea, puede seguir leyendo.





  2. Kivy tiene una solución Mesh nativa incorporada que puede hacer gráficos en 3D. Los ejemplos tampoco son tan simples. Preferí OpenGL desnudo.





  3. Quizás descubrí América tratando de encontrar India. Espero que los camaradas más experimentados corrijan y agreguen.





Antes de comenzar a trabajar con gráficos 3D en kivy, debe leer sobre la biblioteca en general y sobre su instalación (por ejemplo, los manuales recomiendan usar un entorno virtual).





¿Cuál es el problema? Los desarrolladores de kivy ocultan astutamente la descripción de las funciones de OpenGL en su sitio web oficial . La única pregunta es cómo hacer que funcione.





, PyOpenGL+pygame kivy OpenGL :





from OpenGL.GL import *
from OpenGL.GL.shaders import *
      
      



:





from kivy.graphics.opengl import *
      
      



: PyOpenGL numpy , kivy tobytes(). kivy glPixelStorei glTexImage2D glTexStorage2D glTexSubImage2D. 2 ( in, out ) :





#ifdef GL_ES
    precision highp float;
#endif
      
      



- - . PyOpenGL+pygame :





#:
import pygame
from pygame.locals import *

def init():
    pygame.init()
    pygame.display.set_mode((Width, Height), HWSURFACE | OPENGL | DOUBLEBUF)
    '''   ,    PyOpenGL '''
    
def main():
    init()
    while True:
        '''      '''
        pygame.display.flip()
      
      



kivy App, , Widget. , Window, kivy . Window - WindowBase.





:





#:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.base import EventLoop
from kivy.clock import Clock

def init():
    '''    ,    OpenGL '''
init()

class CustomWidget(Widget):
    def __init__(self, **kwargs):
        super(CustomWidget, self).__init__(**kwargs)
    def update_glsl(self, nap):
        '''       '''
        Window.flip()

class MainApp(App):
    def build(self):
        root = CustomWidget()
        EventLoop.ensure_window()
        return root

    def on_start(self):
        Clock.schedule_interval(self.root.update_glsl, 40 ** -1) #   FPS

if __name__ == '__main__':
    MainApp().run()
      
      



( OpenGL), . , Window flip(), . WindowBase. , , MainApp:





def passFunc(W):
    pass

class MainApp(App):
    def build(self):
        root = CustomWidget()
        EventLoop.ensure_window()
        
        #    :
        Window.on_flip = lambda W = Window: passFunc(W)
        
        return root
      
      



? , apk- . , (. , , ):





spec- .





Example . ( ), /.





- ? . - . FPS 51 15 25. :





Mi hijo, mientras tanto, se negó a hacer mi papel, bueno, al menos mira con interés. Los juegos planos para un niño de dos años resultan más adecuados. Para esto empezó todo:





Estilo de serpiente picada: un par de capturas de pantalla del paso de depuración como tributo a Jackie Chan:
Vanguardia 1
Vanguardia 1
Vanguardia 2
Vanguardia 2
Al depurar texturas, existe el deseo de utilizar la tabla de sintonización de la antigua transmisión de televisión.
Al depurar texturas, existe el deseo de utilizar la tabla de sintonización de la antigua transmisión de televisión.



All Articles