Cette question répète la précédente, mais ma précédente était un échec car je n'ai pas copié certaines informations vitales correctement, je dois donc la refaire.La mise en œuvre de pyglet casse le code OpenGL de mon framebuffer qui a déjà fonctionné
Je reçois une erreur avec un appel à une fonction OpenGL. Peut-être que pyglet n'initialise pas OpenGL correctement? L'erreur se produit avec une fonction simple qui a fonctionné avant:
def setup_framebuffer(surface):
#Create texture if not done already
if surface.texture is None:
create_texture(surface)
#Render child to parent
if surface.frame_buffer is None:
surface.frame_buffer = glGenFramebuffersEXT(1)
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, surface.frame_buffer)
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0)
glPushAttrib(GL_VIEWPORT_BIT)
glViewport(0,0,surface._scale[0],surface._scale[1])
glMatrixMode(GL_PROJECTION)
glLoadIdentity() #Load the projection matrix
gluOrtho2D(0,surface._scale[0],0,surface._scale[1])
L'erreur est:
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, surface.frame_buffer) ctypes.ArgumentError: Argument 2:: mauvais type
Mauvais type? Alors glGenFramebuffersEXT (1) donne-t-il le mauvais type maintenant? Pourquoi cela serait-il?
Avant d'appeler cette fonction, j'initialise une instance de classe qui gère mon jeu. Voici la méthode init:
pyglet.options['audio'] = ('alsa','openal','directsound','silent')
self.keys = [False] * 323
self.events = []
self.title = title
self.game_size = game_size
self.first_screen = (1280,720) #Take 120 pixels from the height because the menu bar, window bar and dock takes space
config = pyglet.gl.Config(alpha_size=8,double_buffer=True,sample_buffers=1,samples=4)
self.window = pyglet.window.Window(game_size[0],game_size[1],title,True,config=config)
self.window.set_handler('on_draw',self.game_loop)
self.window.set_handler('on_resize',self.reshaped)
self.window.set_handler('on_key_press',self.keydown)
self.window.set_handler('on_key_release',self.keyup)
self.window.set_handler('on_mouse_press',self.mouse_func)
glViewport(0,0,self.first_screen[0],self.first_screen[1]) #Creates the viewport which is mapped to the window
glEnable(GL_BLEND) #Enable alpha blending
glEnable(GL_TEXTURE_2D) #Enable 2D Textures
glEnable(GL_MULTISAMPLE) #Enable Multisampling anti-aliasing
glEnable(GL_POLYGON_SMOOTH) #Enable antialiased polygons
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST)
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glMatrixMode(GL_PROJECTION)
glLoadIdentity() #Load the projection matrix
gluOrtho2D(0,1280,720,0) #Set an orthorgraphic view
self.game_gap = (0,0)
self.on_exit = on_exit
self.mod_key = 1024 if sys.platform == "darwin" else 64
Surface.__init__(self,game_size)
self.screen_change = True
self.frames = [time.time()]
self.fps = 60
self.last_time = 0
self.fade_surface = Surface([1280,720])
pyglet.font.add_file(os.path.dirname(sys.argv[0]) + "/NEUROPOL.ttf")
pyglet.font.load('NEUROPOL')
Surface est une classe que je fait qui agit un peu comme la classe pygame.Surface mais utilise des textures OpenGL.
Cette méthode configure Window et OpenGL (Probablement pas correctement quel est le problème?) Et après l'avoir appelé, j'ai mis en place des choses pour mon jeu qui utilise la fonction setup_framebuffer pour le rendu des textures. Ensuite, pyglet.app.run() est appelé, ce qui devrait, espérons-le, lancer ma méthode game_loop puisque je l'ai fait self.window.set_handler ('on_draw, self.game_loop) mais mon jeu se bloque avant qu'il n'arrive.
C'est la première fois que j'utilise pyglet. La documentation ne m'explique pas ce que je fais mal. Quelqu'un peut-il aider?
Merci. GlBindFramebufferEXT attend un pointeur vers un tampon.
Pourquoi ne pas simplement modifier votre question précédente? – genpfault
Est-ce que quelqu'un le regarderait depuis qu'il a maintenant un jour? Je ne peux pas vraiment risquer ce désolé parce que je l'utilise pour mon projet A2 Computing et pyglet semble être le seul moyen de résoudre quelques problèmes restants. Je n'ai que 4 semaines pour le faire et je dois aussi faire quelques essais avec des tests. –
-1 pour la publication en double –