This project allows for GLSL shaders to easily be intergrated with either your new or existing Pygame projects without having to touch OpenGL.
import pygame
import pygame_shaders
pygame.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)
while True:
#Fill the display with white
display.fill((255, 255, 255))
#Standard pygame event stuff
for event in pygame.event.get():
if event.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 context
pygame.display.flip()
clock.tick(60)