2016-07-29 1 views
5

Je suis en train de commencer avec OpenGL, en utilisant Python et PyGame.Comment initialiser contexte OpenGL avec PyGame au lieu de GLUT

Je vais utiliser PyGame au lieu de GLUT faire tout ce que l'initialisation, l'ouverture de fenêtres, entrée manutention, etc.

Cependant, mes shaders ne parviennent pas à compiler, à moins que je précise exactement la version d'OpenGL et profil.

Ils font compilez avec l'initialisation de GLUT du livre:

glutInit() 
glutInitDisplayMode(GLUT_RGBA) 
glutInitWindowSize(400, 400) 

# this is what I need 
glutInitContextVersion(3, 3) 
glutInitContextProfile(GLUT_CORE_PROFILE) 

glutCreateWindow("main") 

Mais, avec l'initialisation simple PyGame comme ceci:

pygame.init() 
display = (400, 400) 
pygame.display.set_mode(display, pygame.DOUBLEBUF|pygame.OPENGL) 

qui ne spécifie pas la version OpenGL exacte 3.3 et CORE_PROFILE , le même programme échouerait lors de la tentative de compilation des shaders:

RuntimeError: ('Shader compile failure (0): 0:2(10): error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES\n', ['\n #version 330 core\n layout(location = 0) in vec4 position;\n void main()\n {\n gl_Position = position;\n }\n '], GL_VERTEX_SHADER)

Ma question est: comment dois-je faire cette initialisation avec PyGame?

+0

Avez-vous déjà trouvé la solution? – Oly

Répondre

0

Je pense que ceci:

https://gist.github.com/MorganBorman/4243336

peut-être ce que vous cherchez. Il montre comment utiliser les vertex shaders et fragment shaders dans pygame et PyOpenGL. Si vous n'utilisez pas PyOpenGL, alors vous devrez le faire. Pour la télécharger, il suffit d'exécuter:

pip install PyOpenGL

dans l'invite de commande/Terminal

Si cela ne fonctionne pas, je vous recommande de jeter un oeil à la page d'installation PyOpenGL pour plus de détails:

http://pyopengl.sourceforge.net/documentation/installation.html

J'ai inclus un court exemple de ce que je pense que vous essayez de faire en utilisant une partie du code du lien.

import OpenGL.GL as GL 
import OpenGL.GL.shaders 
import pygame as pg 


#-------------not my code, credit to: Morgan Borman--------------# 
vertex_shader = """ 
#version 330 
in vec4 position; 
void main() 
{ 
    gl_Position = position; 
} 
""" 

fragment_shader = """ 
#version 330 
void main() 
{ 
    gl_FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); 
} 
""" 
#----------------------------------------------------------------# 

def main(): 
    pg.init() 

    #-------------not my code, credit to: Morgan Borman--------------# 
    GL.glClearColor(0.5, 0.5, 0.5, 1.0) 
    GL.glEnable(GL.GL_DEPTH_TEST) 

    shader = OpenGL.GL.shaders.compileProgram(
     OpenGL.GL.shaders.compileShader(vertex_shader, GL.GL_VERTEX_SHADER), 
     OpenGL.GL.shaders.compileShader(fragment_shader, GL.GL_FRAGMENT_SHADER) 
    ) 
    #----------------------------------------------------------------# 

    DISPLAY_DIMENSIONS = (640, 480) 
    display = pg.display.set_mode(DISPLAY_DIMENSIONS, pg.DOUBLEBUF | pg.OPENGL) 
    clock = pg.time.Clock() 
    FPS = 60 

    while True: 
     clock.tick(FPS) 
     for e in pg.event.get(): 
      if e.type == pg.QUIT: 
       return 


     pg.display.flip() 

if __name__ == '__main__': 
    try: 
     main() 
    finally: 
     pg.quit() 

Il ne fait rien d'autre que charger des shaders dans pygame. Ce que je crois est votre objectif principal.

+0

Cela ne semble pas résoudre le problème, ou fait l'essentiel lié. Pensez que nous devons définir le profil de base un peu comment pour pygame – Oly