Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实现pyglet破坏了我曾经工作过的帧缓冲区OpenGL代码_Python_Opengl_Framebuffer_Pyglet_Pyopengl - Fatal编程技术网

Python 实现pyglet破坏了我曾经工作过的帧缓冲区OpenGL代码

Python 实现pyglet破坏了我曾经工作过的帧缓冲区OpenGL代码,python,opengl,framebuffer,pyglet,pyopengl,Python,Opengl,Framebuffer,Pyglet,Pyopengl,这个问题重复了我之前的一个问题,但我之前的一个问题是失败的,因为我没有正确复制一些重要信息,所以我必须重做 调用OpenGL函数时出错。也许pyglet没有正确初始化OpenGL?错误发生在一个以前工作过的简单函数中: def setup_framebuffer(surface): #Create texture if not done already if surface.texture is None: create_texture(surface) #Ren

这个问题重复了我之前的一个问题,但我之前的一个问题是失败的,因为我没有正确复制一些重要信息,所以我必须重做

调用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_帧缓冲区_EXT,surface.frame_缓冲区) 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')
Surface是我创建的一个类,它的行为有点像pygame.Surface类,但使用OpenGL纹理

该方法设置窗口和OpenGL(可能不正确,这是问题?),调用它后,我为我的游戏设置了一些东西,使用setup\u framebuffer函数渲染纹理。然后调用pyglet.app.run(),希望它能运行我的game\u循环方法,因为我使用了self.window.set\u handler('on\u draw,self.game\u loop'),但我的游戏在到达之前就崩溃了

这是我第一次使用pyglet。文档没有向我解释我做错了什么。有人能帮忙吗


谢谢。

glBindFramebufferEXT需要指向缓冲区的指针。好了,在这种情况下你必须使用

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

fb = c_uint()
glGenFramebuffersEXT(1, byref(fb))
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb) 
寻找更好的例子。顺便说一句:

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

为什么不编辑你之前的问题呢?既然已经一天了,有人会看吗?我真的不能冒这个险,抱歉,因为我在A2计算项目中使用它,而pyglet似乎是解决一些遗留问题的唯一方法。我只有4周的时间来做这件事,我还需要写一些测试。你应该更新或删除你以前的问题,这样人们就不会在上面浪费时间。如果你能让更多的人否决这个问题(因为它是由同一个作者故意愚弄的),那么作者就会删除这个问题,他将获得“同侪压力”徽章!让我们实现它吧!伙计们,把那些反对票开了,你们帮了他一个忙!我一直在使用from OpenGL.GL.EXT.framebuffer_object import*和从pyOpenGL导入的其他内容。我从中了解到,pyglet.gl import*提供了相同的函数,但略有不同。所以pyglet自带了它自己的OpenGL包装,这与pyOpenGL不同?“surface.texture=glGenTextures(1)TypeError:此函数至少接受2个参数(给定1个)”非常感谢。我很感谢你的帮助。看来我还有很多要改变。pyglet的OpenGL接口似乎比pyOpenGL更接近其他语言。在某些方面,这是更好的,但主要是恼人的,因为pyOpenGL更有意义。一开始不需要导入cTypes。是的,pyglet有自己的包装器。引用pyglet文档:该接口由pyglet.gl包提供。要使用它,您需要对OpenGL、C和ctypes有很好的了解。您可能更喜欢在不使用ctypes的情况下使用OpenGL,在这种情况下,您应该研究PyOpenGL。PyOpenGL提供了类似的功能,具有更“Pythonic”的界面,并且将在不进行任何修改的情况下使用pyglet。“PyOpenGL提供了类似的功能,具有更“Pythonic”的界面,并且将在不进行任何修改的情况下使用pyglet”,pyOpenGL在我尝试pyglet时无法使用,因此我只能使用目前没有任何问题的pyglet版本。pyOpenGL和pyglet可以完美地协同工作,我的意思是pyOpenGL将愉快地使用打开pyglet窗口提供的OpenGL上下文,您可以将使用pyglet的OpenGL调用与使用PyOpenGL的调用交织在一起。但是,其中一个并不能替代另一个,因为正如您所注意到的,PyOpenGL提供了一个更方便的API。
fb = int(glGenFramebuffersEXT(1))
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb)