实现pyglet导致我的OpenGL帧缓冲代码失效
这个问题跟我之前问的差不多,但之前的问题没解决好,因为我没把一些重要的信息复制正确,所以我得重新问一遍。
我在调用一个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: argument 2: : wrong type
错误类型?那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')
Surface是我自己做的一个类,有点像pygame中的Surface类,但它使用的是OpenGL纹理。
这个方法设置了窗口和OpenGL(可能设置得不太对,这可能就是问题所在?),在调用它之后,我为我的游戏设置了一些东西,使用setup_framebuffer函数来渲染纹理。然后我调用了pyglet.app.run(),希望能运行我的game_loop方法,因为我设置了self.window.set_handler('on_draw', self.game_loop),但我的游戏在到达那里之前就崩溃了。
这是我第一次使用pyglet。文档没有告诉我我哪里做错了。有人能帮忙吗?
谢谢。
1 个回答
1
glBindFramebufferEXT 这个函数需要一个指向缓冲区的指针。根据我所知道的,你在这种情况下需要使用 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)