2010-03-23 14 views
-5

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.

+0

Pourquoi ne pas simplement modifier votre question précédente? – genpfault

+0

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. –

+3

-1 pour la publication en double –

Répondre

1

AFAIK, vous devez utiliser ctypes dans ce cas.

from pyglet.gl import * 
from ctypes import c_uint, byref 

fb = c_uint() 
glGenFramebuffersEXT(1, byref(fb)) 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb) 

Recherche pyglet mailing list pour de meilleurs exemples. Et BTW:

>> glGenFramebuffersEXT(1) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: this function takes at least 2 arguments (1 given) 

Edit: j'aurais deviné que vous utilisez pyopengl:

fb = int(glGenFramebuffersEXT(1)) 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb) 
+0

J'utilise depuis OpenGL.GL.EXT.framebuffer_object import * et d'autres imports de pyOpenGL. Je prends de ce que de pyglet.gl import * donne les mêmes fonctions avec de légères différences qui devraient fonctionner.Alors pyglet est livré avec son propre wrapper OpenGL qui est différent de pyOpenGL? "surface.texture = glGenTextures (1) TypeError: cette fonction prend au moins 2 arguments (1 donnée) " Merci beaucoup. J'apprécie ton aide. –

+0

On dirait que j'ai plus à changer. Il semble aussi que l'interface OpenGL de pyglet soit plus proche d'autres langages que pyOpenGL. À certains égards, c'est mieux mais surtout c'est agaçant parce que pyOpenGL a plus de sens. Pas besoin d'importer des cTypes pour commencer. –

+0

Oui, pyglet a son propre emballage. Citation de pyglet docs: L'interface est fournie par le paquet pyglet.gl. Pour l'utiliser, vous aurez besoin d'une bonne connaissance de OpenGL, C et ctypes. Vous préférerez peut-être utiliser OpenGL sans utiliser de ctypes, auquel cas vous devriez étudier PyOpenGL. PyOpenGL fournit des fonctionnalités similaires avec une interface plus "Pythonic", et fonctionnera avec pyglet sans aucune modification. –