2016-07-29 43 views
5
initialisieren

Ich versuche, mit OpenGL zu beginnen, mit Python und PyGame.Wie OpenGL-Kontext mit PyGame statt GLUT

Ich werde PyGame statt GLUT verwenden, um alle die Initialisierung zu tun, Fenster öffnen, Eingang Handhabung usw.

jedoch meine Shadern kompilieren versagen, wenn ich genau die Version von OpenGL angeben und Profil.

Sie tun mit GLUT Initialisierung aus dem Buch kompilieren:

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

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

glutCreateWindow("main") 

Aber mit einfachen PyGame Initialisierung wie folgt aus:

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

die angeben, nicht genau OpenGL Version 3.3 und CORE_PROFILE , das gleiche Programm würde beim Versuch, Shader zu kompilieren, fehlschlagen:

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)

Meine Frage ist: Wie mache ich diese Initialisierung mit PyGame?

+0

Haben Sie das jemals gelöst? – Oly

Antwort

0

Ich denke, das:

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

könnte das sein, was Sie suchen. Es zeigt, wie Vertex-Shader und Fragment-Shader in Pygame und PyOpenGL verwendet werden. Wenn du PyOpenGL nicht benutzt, dann musst du es tun. Um es herunterzuladen, führen Sie einfach:

pip install PyOpenGL

in Ihrer Eingabeaufforderung/Terminal

Wenn das nicht funktioniert, empfehle ich einen Blick auf die PyOpenGL Installationsseite, um weitere Informationen unter:

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

Ich habe ein kurzes gekochtes Beispiel von dem, was ich denke, versucht, mit etwas Code aus dem Link zu tun.

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() 

Es tut nichts anderes als laden Shader in Pygame. Was ich glaube, ist dein Hauptziel.

+0

Dies scheint das Problem nicht zu lösen, oder der verknüpfte Inhalt. Ich denke, wir müssen das Kernprofil etwas für pygame festlegen – Oly