Реализация pyglet ломает мой когда-то работающий код OpenGL фреймбуфера - PullRequest
0 голосов
/ 23 марта 2010

Этот вопрос повторяет мой предыдущий, но мой предыдущий был неудачным, потому что я не правильно скопировал важную информацию, поэтому мне придется повторить ее.

Я получаю сообщение об ошибке при вызове функции OpenGL. Может быть, pyglet неправильно инициализирует OpenGL? Ошибка происходит с простой функцией, которая работала раньше:

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

Ошибка:

glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, surface.frame_buffer) ctypes.ArgumentError: аргумент 2:: неверный тип

Неправильный тип? Тогда glGenFramebuffersEXT (1) теперь дает неправильный тип? С чего бы это?

Перед вызовом этой функции я инициализирую экземпляр класса, который управляет моей игрой. Вот метод 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')

Поверхность - это созданный мной класс, который немного похож на класс pygame.Surface, но использует текстуры OpenGL.

Этот метод настраивает Window и OpenGL (возможно, неправильно, в чем проблема?), И после вызова я настроил некоторые вещи для своей игры, которая использует функцию setup_framebuffer для рендеринга в текстуры. Затем вызывается pyglet.app.run (), который, я надеюсь, должен запустить мой метод game_loop, поскольку я сделал self.window.set_handler ('on_draw, self.game_loop), но моя игра вылетает до того, как она туда попадет.

Я впервые использую pyglet. Документация не объясняет мне, что я делаю неправильно. Кто-нибудь может помочь?

Спасибо.

1 Ответ

1 голос
/ 23 марта 2010

glBindFramebufferEXT ожидает указатель на буфер. AFAIK, вы должны использовать ctypes в этом случае.

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

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

Поиск список рассылки pyglet для лучших примеров. И кстати:

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

Edit: Я должен был догадаться, что вы используете pyOpenGL:

fb = int(glGenFramebuffersEXT(1))
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb)
...