OpenGL + Python multiplateforme avec Kivy

Contexte: étant un programmeur naïf de Tchouktche, je pensais: "python est tellement multiplateforme, je vais écrire un jouet pour mon fils, le faire fonctionner sur une tablette, le laisser jouer." En conséquence, il a fallu deux semaines pour essayer de trouver une solution pour passer de PyOpenGL + pygame à kivy, car je n'ai pas trouvé d'exemple clair d'utilisation d'OpenGL avec kivy. Peut-être que mon expérience aidera quelqu'un à gagner du temps.





Exemple de diagramme de processus
Exemple de diagramme de processus

Avertissement:





  1. Je n'incite personne à développer des applications en python avec des graphismes 3D pour Android. Ce n'est pas l'option la plus intelligente. Mais si vous le souhaitez vraiment, vous pouvez continuer à lire.





  2. Kivy a une solution de maillage native intégrée qui peut faire des graphiques 3D. Les exemples ne sont pas non plus si simples. J'ai préféré OpenGL nu.





  3. Peut-être ai-je découvert l'Amérique en essayant de trouver l'Inde. J'espère que des camarades plus expérimentés corrigeront et ajouteront.





Avant de commencer à travailler avec des graphiques 3D dans kivy, vous devez vous renseigner sur la bibliothèque en général et sur son installation (par exemple, les manuels recommandent d'utiliser un environnement virtuel).





Quel est le problème? Les développeurs de kivy cachent astucieusement la description des fonctions OpenGL sur leur site officiel . La seule question est de savoir comment le faire fonctionner.





, 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. :





Mon fils, quant à lui, a refusé de jouer mon rôle, enfin, au moins il regarde avec intérêt. Les jeux tirés à plat pour un enfant de deux ans se révèlent mieux adaptés. C'est pour cela que tout a commencé:





Chopped Snake Style - Quelques captures d'écran de l'étape de débogage en hommage à Jackie Chan:
Avant-garde 1
Avant-garde 1
Avant-garde 2
Avant-garde 2
Lors du débogage des textures, il est souhaitable d'utiliser la table de réglage de l'ancienne émission de télévision
Lors du débogage des textures, il est souhaitable d'utiliser la table de réglage de l'ancienne émission de télévision



All Articles