我编写了这个简单的程序,它使用 将图像显示到moderngl上下文中,pygame我的目标是在屏幕上绘制一个矩形。(这显然只是一个最小的工作示例,真正的目标是为纹理制作动画并在屏幕上制作更多的矩形)。
import moderngl
import numpy as np
import pygame
from PIL import Image
class MyPyGame:
def __init__(self):
pygame.init()
self._surface = pygame.display.set_mode((800, 600), pygame.DOUBLEBUF | pygame.OPENGL)
self.context = moderngl.create_context()
image = Image.open("test.jpg").transpose(Image.FLIP_TOP_BOTTOM)
self.texture = self.context.texture(image.size, 3, image.tobytes())
self.texture.use(0)
self.program = self.context.program(
vertex_shader="""
#version 330
in vec2 in_position;
out vec2 uv0;
void main() {
gl_Position = vec4(in_position, 0.0, 1.0);
uv0 = (0.5 * in_position) + vec2(0.5);
}
""",
fragment_shader="""
#version 330
out vec4 fragColor;
uniform sampler2D texture0;
in vec2 uv0;
void main() {
fragColor = texture(texture0, uv0);
}
""")
vertices_quad_2d = np.array([-1.0, 1.0, -1.0, -1.0, 1.0, -1.0,
-1.0, 1.0, 1.0, -1.0, 1.0, 1.0], dtype=np.float32)
vertex_buffer_quad_2d = self.context.buffer(vertices_quad_2d.tobytes())
self.vertex_array = self.context.vertex_array(self.program, [(vertex_buffer_quad_2d, "2f", "in_position")])
def run(self):
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
self.vertex_array.render()
pygame.display.flip()
if __name__ == '__main__':
app = MyPyGame()
app.run()
我尝试过的一些事情:
用“常规”方式绘制一个矩形
pygame,即在 main 方法中添加这一行,run在顶点数组渲染之前或之后(两者都不起作用):pygame.draw.rect(self._surface, (200, 200, 200), [100, 100, 100, 100])而不是 flag
pygame.OPENGL,使用 flagpygame.OPENGLBLIT然后blit使用矩形(没用,更多信息在这里)使用
moderngl上下文作为主显示器内的窗口,如此处所建议的,然后blit将矩形放到主显示器上。这不是我的目标,我希望能够在上下文中显示文本和形状,但仍然想至少尝试一下。也没有工作,下面的代码(替换相应的代码__init__)导致异常cannot detect OpenGL context:pygame.init() self.main_window = pygame.display.set_mode((800, 600)) self.graphics_window = pygame.Surface((700, 600), pygame.DOUBLEBUF | pygame.OPENGL) self.main_window.blit(self.graphics_window, (100, 0)) self.context = moderngl.create_context()使用“开箱即用”窗口
moderngl_window使用pygame(代码here)。同样,没有成功在上下文本身上绘制一个矩形 - 尝试在窗口代码本身内部或当我编写从这个 pygame 窗口继承的我自己的窗口时从 (1) 添加同一行。
[正在运行:Windows10、python3.6、pygame 1.9.6、moderngl 5.6.1]
如何创建一个既显示图形又具有一层服装对象的窗口?(文本、按钮等)
编辑:也许需要澄清我的动机:我想在背景中有一层图形,在上面的例子中是对输入图像的一些操作。然后,在前台,我想要一些服装 PyGame 对象,如几何形状、按钮等。