Я написал эту простую программу, которая отображает изображение в контексте 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
, то есть добавьте эту строку в основной метод run
либо до, либо после отрисовки массива вершин ( оба не работают):
pygame.draw.rect(self._surface, (200, 200, 200), [100, 100, 100, 100])
Вместо флага pygame.OPENGL
используйте флаг pygame.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
( здесь код ). Опять же, не удалось нарисовать прямоугольник на самом контексте - попытался добавить ту же строку из (1) либо внутри самого кода окна, либо когда я пишу свое собственное окно, которое наследуется от этого окна pygame.
[Работаем над: Windows10, python3 .6, pygame 1.9.6, moderngl 5.6.1]
Как создать окно, одновременно отображающее графику и есть слой предметов костюма? (текст, кнопки и т. д. c.)
РЕДАКТИРОВАТЬ: Возможно, необходимо пояснение для моей мотивации: я хотел бы иметь один слой графики в фоновом режиме, что в приведенном выше примере представляет собой некоторую манипуляцию с входное изображение. Затем, на переднем плане, я хотел бы иметь некоторые объекты PyGame костюма, такие как геометрические c формы, кнопки и т. Д. c.