Pyopengl im Browser anzeigen (Python + Aal)

Einführung

Im Browser verfügt OpenGL bereits über WebGL. Aber ich kann keinen Compute Shader und andere Shader verwenden. Die Grammatik ist auch anders. WebGL ist jedoch für die GUI überwiegend besser. Einfach zu verwenden. Ich glaube nicht, dass die meisten Leute Pyopengl verwenden. Ich denke, das liegt daran, dass der GUI nicht geholfen werden kann. Eines Tages wollte ich Pyopengl in meinem Browser machen. Als ich kürzlich zum ersten Mal Informationen in EEL sammelte, [OpenCV] OpenCV-Bilder auf Aal anzeigen Ich fand. Dies muss getan werden. Ich hatte keine Kenntnisse über den Lebenslauf, also war ich wirklich begeistert, aber ich konnte es tun.

Quellcode

main.py


import eel
from OpenGL.GL import *
from OpenGL.WGL import *
from ctypes import *
from ctypes.wintypes import *
import numpy as np
import cv2
import base64
import time
import atexit

kernel32 = windll.kernel32
user32 = windll.user32
winmm = windll.winmm 
    
# window init
XRES, YRES = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)
WS_OVERLAPPEDWINDOW = 0xcf0000
hWnd = user32.CreateWindowExA(0,0xC018,0,WS_OVERLAPPEDWINDOW,0,0,XRES,YRES,0,0,0,0)
hdc = user32.GetDC(hWnd)   
user32.SetForegroundWindow(hWnd)

# GL context init
PFD_SUPPORT_OPENGL = 32
PFD_DOUBLEBUFFER = 1
pfd = PIXELFORMATDESCRIPTOR(0,1,PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,32,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0)
SetPixelFormat(hdc, ChoosePixelFormat(hdc, pfd), pfd)
hGLrc = wglCreateContext(hdc)
wglMakeCurrent(hdc, hGLrc)

def finish():
    # GL context finish
    wglMakeCurrent(0, 0)
    wglDeleteContext(hGLrc)
    # windoe finish
    user32.ReleaseDC(hWnd, hdc)
    user32.PostQuitMessage(0)
    user32.DestroyWindow(hWnd)
    #print("finish")
atexit.register(finish)


def main():
    vsh = """
#version 430

layout(location = 0) in vec2 p;

void main(){
    gl_Position = vec4(p, 0, 1);
}
"""

    fsh = """
#version 430

out vec4 fragColor;

uniform vec2 resolution;
uniform float time;

void main() {
    vec2 p = (2.0 * gl_FragCoord.xy - resolution.xy) / resolution.y;
    p += vec2(cos(time), sin(time)) * 0.5;
    float g = exp(-1.5 * dot(p,p));
    fragColor = vec4(g*.3, g*.5, g, 1)+.3;
}
"""

    width = 640
    height = 350


    # GL init
    glClearColor(0, 0, 0, 1)
    glEnable(GL_CULL_FACE)
    glCullFace(GL_BACK)
    glEnable(GL_DEPTH_TEST)
    glDepthFunc(GL_LEQUAL)
    glViewport(0,0,width,height)
    
    program = glCreateProgram()
    for s, t in zip((vsh, fsh), (GL_VERTEX_SHADER, GL_FRAGMENT_SHADER)):    
        shader = glCreateShader(t)
        glShaderSource(shader, s)
        glCompileShader(shader)
        if glGetShaderiv(shader, GL_COMPILE_STATUS) != GL_TRUE:
            raise RuntimeError(glGetShaderInfoLog(shader).decode())
        glAttachShader(program, shader)
    glLinkProgram(program)
    glUseProgram(program)
    glUniform2f(glGetUniformLocation(program, "resolution"), width,height)
    vertices = np.array([-1,-1,1,-1,-1,1,1,1], np.float32)
    glBindBuffer(GL_ARRAY_BUFFER, glGenBuffers(1))
    glBufferData(GL_ARRAY_BUFFER, vertices.nbytes, (c_float*len(vertices))(*vertices), GL_STATIC_DRAW)
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, None)
    glEnableVertexAttribArray(0)
    
    pixels = np.zeros((height,width,3), np.uint8)
    st = time.time()
    while True:
        eel.sleep(0.01)
        elapsedTime = time.time()-st
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glUniform1f(glGetUniformLocation(program, "time"), elapsedTime)
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
        glReadPixels(0, 0, width,height, GL_BGR, GL_UNSIGNED_BYTE, pixels)
        _, image = cv2.imencode('.jpg', np.flipud(pixels))
        eel.set_base64image("data:image/jpg;base64," + base64.b64encode(image).decode())
        eel.set_elapsedtime(round(elapsedTime,1))

if __name__ == '__main__':
    eel.init('web')
    eel.start('index.html', block=False)
    main()

index.html


<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <script type="text/javascript" src="/eel.js"></script>

        <script>
            eel.expose(set_elapsedtime);
            function set_elapsedtime(elapsedtime0) {
                document.getElementById("elapsedtime").innerHTML = "elapsedtime:" + elapsedtime0 + "s";
            }
            eel.expose(set_base64image);
            function set_base64image(img) {
                document.getElementById("python_video").src = img;
            }
        </script>
    </head>
    <body>
        <div id="elapsedtime">elapsedtime</div>
        <img id="python_video" >
    </body>
</html>

abschließend

Es wird von Python + Aal realisiert. Für weitere Informationen suchen Sie bitte mit Python, Aal. Ich habe auch den Abschlussprozess von OpenGL sicher geschrieben. Ich mache es mit Python, also brauchst du es vielleicht nicht. Ich bin mir darüber nicht sicher. Ich bin zu enthusiastisch und ich glaube nicht, dass es jemand sehen wird, aber es dient auch als eigenes Memorandum.

Recommended Posts

Pyopengl im Browser anzeigen (Python + Aal)
Zeigen Sie eine Liste der Alphabete in Python 3 an
Zeigen Sie Python 3 im Browser mit MAMP an
Machen Sie einen Screenshot in Python
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
Erstellen Sie ein Lesezeichen in Python
Zeigen Sie ein Histogramm der Bildhelligkeitswerte in Python an
Zeichne ein Herz in Python
VScode-Umgebungskonstruktion (auf Mac) und Diagrammanzeige in Python (@ Browser)
Wahrscheinlich in einer Nishiki-Schlange (Originaltitel: Vielleicht in Python)
Schreiben Sie eine Dichotomie in Python
[Python] Verwalten Sie Funktionen in einer Liste
Drücken Sie einen Befehl in Python (Windows)
Zeichnen Sie eine Streudiagrammmatrix mit Python
ABC166 in Python A ~ C Problem
Schreiben Sie A * (A-Stern) -Algorithmen in Python
Erstellen Sie eine Binärdatei in Python
Audio-Wellenform-Anzeige in Python
Zeigen Sie Zeichen wie AA in Python an
Löse ABC036 A ~ C mit Python
Schreiben Sie das Vim-Plugin in Python
Schreiben Sie eine Suche mit Tiefenpriorität in Python
Implementierung eines einfachen Algorithmus in Python 2
Löse ABC037 A ~ C mit Python
Führen Sie einen einfachen Algorithmus in Python aus
Zeichnen Sie ein CNN-Diagramm in Python
Erstellen Sie eine zufällige Zeichenfolge in Python
Beim Schreiben eines Programms in Python
Generieren Sie eine erstklassige Sammlung in Python
Anzeigen von LaTeX-Notationsformeln in Python, matplotlib
[Python, Julia] 3D-Anzeige in der Jupyter-Mayavi-Bibliothek
Spiralbuch in Python! Python mit einem Spiralbuch! (Kapitel 14 ~)
Löse ABC175 A, B, C mit Python
Verwenden Sie print in Python2 lambda expression
Ein einfacher HTTP-Client, der in Python implementiert ist
Führen Sie eine nicht rekursive Euler-Tour in Python durch
Django ~ Lass es uns im Browser anzeigen ~
Ich habe ein Pay-Management-Programm in Python erstellt!
Vorsichtsmaßnahmen beim Beizen einer Funktion in Python
Schreiben Sie den Test in die Python-Dokumentzeichenfolge
Anzeigen von Matplotlib-Diagrammen in einer Webanwendung
Versuchen Sie, ein SYN-Paket in Python zu senden
Versuchen Sie, eine einfache Animation in Python zu zeichnen
Erstellen Sie eine einfache GUI-App in Python
Schreiben Sie eine kurze Eigenschaftsdefinition in Python
Mit Python Teil 2 ein Herz zeichnen (SymPy Edition)
[Python] [Windows] Machen Sie eine Bildschirmaufnahme mit Python
Führen Sie den Python-Interpreter im Skript aus
Wie bekomme ich Stacktrace in Python?
So zeigen Sie die neunundneunzig Tabelle in Python an
Schreiben Sie ein Caesar-Verschlüsselungsprogramm in Python
Hash in Perl ist ein Wörterbuch in Python
Scraping von Websites mit JavaScript in Python
Schreiben Sie eine einfache Giermethode in Python
Löse ABC165 A, B, D mit Python
[GPS] Erstellen Sie eine kml-Datei mit Python
Schreiben Sie ein einfaches Vim-Plugin in Python 3