سؤال

يكرر هذا السؤال الخاص بي السابق ، لكن طرحه السابق كان فشلًا لأنني لم أنسخ بعض المعلومات الحيوية بشكل صحيح ، لذلك يجب أن أعيدها.

أحصل على خطأ في مكالمة إلى وظيفة 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) النوع الخطأ الآن؟ لماذا سيكون ذلك؟

قبل أن تسمى هذه الوظيفة ، قم بتهيئة مثيل الفصل الذي يدير لعبتي. ها هي فيه طريقة:

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 هو فئة صنعتها والتي تعمل قليلاً مثل فئة Pygame.surface ولكنها تستخدم قوام OpenGL.

تقوم هذه الطريقة بإعداد النافذة و OpenGL (ربما ليس بشكل صحيح ما هي المشكلة؟) وبعد أن أسميها ، أقوم بإعداد بعض الأشياء لعلبي التي تستخدم وظيفة SETUP_FRAMEBUFFER لتقديمها إلى القوام. ثم يسمى pyglet.app.run () والتي نأمل أن تدير طريقة game_loop منذ أن فعلت self.window.set_handler ('On_draw ، self.game_loo) ولكن تعطل لعبتي قبل أن تصل إلى هناك.

هذه هي المرة الأولى التي أستخدم فيها Pyglet. الوثائق لا تشرح لي ما أفعله خطأ. هل أستطيع مساعدتك؟

شكرًا لك.

هل كانت مفيدة؟

المحلول

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)

تعديل:كان يجب أن أظن أنك تستخدم pyopengl:

fb = int(glGenFramebuffersEXT(1))
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top