如何使用pygame同时使用pyopengl绘图?

cgvd09ve  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(127)

我有一个用python写的程序,它使用pygame沿着pyopengl。唯一的问题是,我不能用pygame.draw在屏幕上画任何东西,而pygame.draw是我用来与程序接口的。我想知道是否有一种方法可以使用pygame的系统进行绘制,同时还可以使用pyopengl在其后面绘制3D。

pgccezyw

pgccezyw1#

你不能直接这么做。
但是,您可以使用pygame.draw模块或pygame.Surface.blitpygame.Surface对象上绘制。使用pygame.PixelArray直接访问曲面上的像素。使用像素生成OpenGL Texture对象。这个纹理可以在OpenGL中使用。

def surfaceToTexture(pygame_surface):
    rgba_surface = pygame.image.tostring(pygame_surface, 'RGBA')
    width, height = pygame_surface.get_size()
    texture_obj = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, texture_obj)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba_surface)
    glBindTexture(GL_TEXTURE_2D, 0)
    return texture_obj

image = pygame.image.load('my_image.png')
texture = surfaceToTexture(image)

在另一个方向上,您可以渲染为OpenGL RenderbufferTexture对象(请参见Framebuffers)。使用glReadPixelsglGetTexImage从GPU加载纹理,并使用pygame.image.frombuffer创建pygame.Surface

size = screen.get_size()
buffer = glReadPixels(0, 0, *size, GL_RGBA, GL_UNSIGNED_BYTE)
pygame.display.flip()
screen_surf = pygame.image.fromstring(buffer, size, "RGBA")
image_buffer = glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE)
image_surf = pygame.image.fromstring(image_buffer, (width, height), "RGBA")

Pygame可以3d吗?、PyGame and ModernGL libraryPyGame and OpenGL 4PyGame and OpenGL immediate mode (Legacy OpenGL)

相关问题