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