This project allows for GLSL shaders to easily be intergrated with either your new or existing Pygame projects without having to touch OpenGL.
importpygameimportpygame_shaderspygame.init()
clock=pygame.time.Clock()
#Create an opengl pygame Surface, this will act as our opengl context. screen=pygame.display.set_mode((600, 600), pygame.OPENGL|pygame.DOUBLEBUF)
#This is our main display we will do all of our standard pygame rendering on.display=pygame.Surface((600, 600))
#The shader we are using to communicate with the opengl context (standard pygame drawing functionality does not work on opengl displays)screen_shader=pygame_shaders.DefaultScreenShader(display) # <- Here we supply our default display, it's this display which will be displayed onto the opengl context via the screen_shader#This is our shader object which we can use to render the given shaders onto the screen in various ways. shader=pygame_shaders.Shader(pygame_shaders.DEFAULT_VERTEX_SHADER, "fragment.glsl", screen) #<- Because we plan on using this shader for direct rendering (we supply the surface on which we plan to do said direct rendering in this case, screen) whileTrue:
#Fill the display with whitedisplay.fill((255, 255, 255))
#Standard pygame event stuffforeventinpygame.event.get():
ifevent.type==pygame.QUIT:
pygame.quit()
#Render a rect onto the display using the standard pygame method for drawing rects.pygame.draw.rect(display, (255, 0, 0), (200, 200, 20, 20))
#Render the contents of "display" (main surface) onto the opengl screen.screen_shader.render() #Render the shader directly onto the display.shader.render_direct(pygame.Rect(0, 0, 100, 100)) #Update the opengl contextpygame.display.flip()
clock.tick(60)