Frage

Diese Frage wiederholt meine früher ein, aber meine früher ein ein Fehler war, weil ich nicht einige wichtige Informationen korrekt kopiert haben, so habe ich es wiederholen.

Ich erhalte eine Fehlermeldung mit einem Aufruf zu einer OpenGL-Funktion. Vielleicht ist die Initialisierung Pyglet nicht OpenGL korrekt? Der Fehler tritt mit einer einfachen Funktion arbeitet vor:

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

Der Fehler ist:

glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, surface.frame_buffer) ctypes.ArgumentError: Argument: 2: falsche Art

Falscher Typ? Dann wird glGenFramebuffersEXT (1) jetzt die falsche Art geben? Warum sollte das sein?

Bevor diese Funktion aufgerufen wird ich eine Instanz der Klasse zu initialisieren, die mein Spiel verwaltet. Hier ist die init Methode:

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 ist eine Klasse, die ich gemacht, die ein bisschen wie die pygame.Surface Klasse wirkt, sondern nutzt OpenGL-Texturen.

Diese Methode richtet das Fenster und OpenGL (wahrscheinlich nicht richtig, was das Problem ist?) Und nach dem Aufruf ich Set-up einige Dinge für mein Spiel, das die setup_framebuffer Funktion verwendet zu Texturen zu machen. Dann pyglet.app.run () aufgerufen wird, die hoffentlich sollte meine game_loop Methode laufen, da ich self.window.set_handler tat ( 'on_draw, self.game_loop), aber mein Spiel stürzt ab, bevor er dort ankommt.

Dies ist das erste Mal, dass ich Gebrauch Pyglet habe. Die Dokumentation erklärt nicht mir, was ich falsch mache. Kann mir jemand helfen?

Danke.

War es hilfreich?

Lösung

erwartet glBindFramebufferEXT Zeiger auf einen Puffer. AFAIK, müssen Sie verwenden ctypes in diesem Fall.

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

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

Pyglet Mailingliste für bessere Beispiele. Und 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: Ich habe gedacht, dass Sie PyOpenGL verwenden:

fb = int(glGenFramebuffersEXT(1))
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top