تنفيذ Pyglet يكسر بلدي رمز OpenGL
-
21-09-2019 - |
سؤال
يكرر هذا السؤال الخاص بي السابق ، لكن طرحه السابق كان فشلًا لأنني لم أنسخ بعض المعلومات الحيوية بشكل صحيح ، لذلك يجب أن أعيدها.
أحصل على خطأ في مكالمة إلى وظيفة 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)