Plattformübergreifendes OpenGL + Python mit Kivy

Hintergrund: Als naiver Chukchi-Programmierer dachte ich: "Python ist so plattformübergreifend, dass ich ein Spielzeug für meinen Sohn schreibe, es auf einem Tablet laufen lasse und es spielen lasse." Infolgedessen dauerte es zwei Wochen, bis ich versuchte, eine Lösung für den Wechsel von PyOpenGL + Pygame zu Kivy zu finden, da ich kein klares Beispiel für die Verwendung von OpenGL mit Kivy fand. Vielleicht hilft meine Erfahrung jemandem, Zeit zu sparen.





Beispielprozessdiagramm
Beispielprozessdiagramm

Haftungsausschluss:





  1. Ich fordere niemanden auf, Anwendungen in Python mit 3D-Grafiken für Android zu entwickeln. Dies ist nicht die klügste Option. Aber wenn Sie wirklich wollen, dann können Sie weiterlesen.





  2. Kivy verfügt über eine integrierte Mesh-Lösung, die 3D-Grafiken erstellen kann. Beispiele sind auch nicht so einfach. Ich habe nacktes OpenGL bevorzugt.





  3. Vielleicht habe ich Amerika entdeckt, als es versuchte, Indien zu finden. Ich hoffe, dass erfahrene Kameraden korrigieren und hinzufügen werden.





Bevor Sie mit der Arbeit mit 3D-Grafiken in Kivy beginnen, sollten Sie sich über die Bibliothek im Allgemeinen und deren Installation informieren (in den Handbüchern wird beispielsweise die Verwendung einer virtuellen Umgebung empfohlen).





Was ist das Problem? Die Kivy-Entwickler verstecken die Beschreibung der OpenGL-Funktionen geschickt auf ihrer offiziellen Website . Die Frage ist nur, wie es funktioniert.





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





Mein Sohn weigerte sich unterdessen, meine Rolle zu spielen, zumindest sieht er interessiert aus. Flach gezogene Spiele für einen Zweijährigen erweisen sich als besser geeignet. Dafür hat alles angefangen:





Chopped Snake Style - Ein paar Screenshots aus dem Debug-Schritt als Hommage an Jackie Chan:
Avantgarde 1
Avantgarde 1
Avantgarde 2
Avantgarde 2
Beim Debuggen von Texturen besteht der Wunsch, die Tuning-Tabelle aus der alten TV-Sendung zu verwenden
Beim Debuggen von Texturen besteht der Wunsch, die Tuning-Tabelle aus der alten TV-Sendung zu verwenden



All Articles