我有一个用Python编写的程序,使用pygame和pyopengl。唯一的问题是,我无法使用pygame.draw在屏幕上绘制任何东西,而这正是我打算用来与我的程序进行交互的工具。我想知道是否有办法在使用pygame系统绘图的同时,在其后面使用pyopengl进行3D绘制。
你不能直接这样做。
但是,你可以使用pygame.draw
模块或pygame.Surface.blit
在pygame.Surface
对象上绘制。使用pygame.PixelArray
直接访问表面上的像素。使用像素生成OpenGL 纹理对象。此纹理可用于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)
glReadPixels
或 glGetTexImage
从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和ModernGL库, PyGame和OpenGL 4或PyGame和OpenGL即时模式(Legacy OpenGL)。