クロスプラットフォームのOpenGL + PythonとKivy

背景:素朴なチュクチプログラマーである私は、「Pythonは非常にクロスプラットフォームなので、息子のためにおもちゃを書いて、タブレットで実行し、遊ばせます」と考えました。その結果、KivyでOpenGLを使用する明確な例が見つからなかったため、PyOpenGL + pygameからkivyに移行するためのソリューションに出くわすのに2週間かかりました。おそらく私の経験は誰かが時間を節約するのに役立つでしょう。





サンプルプロセス図
サンプルプロセス図

免責事項:





  1. 私は、Android用の3Dグラフィックスを使用してPythonでアプリケーションを開発することを誰にも勧めません。これは最も賢いオプションではありません。しかし、本当にやりたいのであれば、読み進めることができます。





  2. Kivyには、3Dグラフィックスを実行できるネイティブメッシュソリューションが組み込まれています。例もそれほど単純ではありません。私は裸のOpenGLを好みました。





  3. おそらく私はアメリカがインドを見つけようとしているのを発見しました。より経験豊富な仲間が修正して追加することを願っています。





kivyで3Dグラフィックスの操作開始する前に、ライブラリ全般とそのインストールについて読む必要があります(たとえば、マニュアルでは仮想環境の使用を推奨しています)。





何が問題ですか?Kivy開発者は、公式WebサイトでOpenGL関数の説明を巧妙に隠しています唯一の問題は、それをどのように機能させるかです。





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





その間、私の息子は私の役を演じることを拒否しました、まあ、少なくとも彼は興味を持って見えます。2歳児向けのフラットドローゲームの方が適していることがわかりました。これがすべての始まりです:





チョップドスネークスタイル-ジャッキーチェンへのオマージュとしてのデバッグステップからのスクリーンショットのカップル:
ヴァンガード1号
ヴァンガード1号
ヴァンガード2号
ヴァンガード2号
テクスチャをデバッグするときは、古いテレビ放送のチューニングテーブルを使用したいという要望があります。
テクスチャをデバッグするときは、古いテレビ放送のチューニングテーブルを使用したいという要望があります。



All Articles