2010-03-23 2 views
-5

이 질문은 필자의 이전 버전을 반복하지만 일부 중요한 정보를 올바르게 복사하지 않았기 때문에 이전 버전이 실패한 것이므로 다시 실행해야합니다.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 : 인수 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') 

표면 내가 pygame.Surface 클래스처럼 조금 역할을하지만, OpenGL은 텍스처를 사용하는 만든 클래스입니다.

그 방법은 Window와 OpenGL을 설정하고 (아마 문제는 아닌가?), 게임을 호출 한 후 setup_framebuffer 함수를 사용하여 텍스쳐로 렌더링하는 몇 가지 작업을 설정했다. 그렇다면 self.window.set_handler ('on_draw, self.game_loop)를했기 때문에 내 game_loop 메소드를 실행해야하는 pyglet.app.run()이 호출되었지만 내 게임이 충돌하기 전에 충돌합니다.

저는 처음으로 pyglet을 사용했습니다. 그 문서는 제가 잘못하고있는 것을 나에게 설명하지 않습니다. 누구든지 도와 줄 수 있습니까?

감사합니다.

+0

왜 당신의 이전 질문을 편집하지? – genpfault

+0

지금은 하루가 지난 이래로 누구든지 살펴볼 수 있습니까? 나는 이것을 A2 Computing 프로젝트에 사용하고 pyglet이 몇 가지 남은 문제를 해결할 수있는 유일한 방법 인 것 같아 미안하다. 이 작업을 수행하는 데 4 주가 밖에 걸리지 않으므로 테스트를 통해 글을 써야합니다. –

+3

-1 중복 게시물의 경우 –

답변

1

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 mailing list입니다. 그리고 BTW :

>> 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) 
+0

OpenGL.EXT.framebuffer_object 가져 오기 * 및 pyOpenGL에서 가져온 다른 가져 오기에서 사용했습니다. pyglet.gl 가져 오기 *에서 약간의 차이가있는 동일한 기능을 제공합니다.그래서 pyglet은 pyOpenGL과 다른 OpenGL 래퍼를 가지고 있습니다. 는 : 가 대단히 감사합니다 "surface.texture =은 glGenTextures (1) 형식 오류이 기능은 적어도 2 개 인자 (주어진 1) 걸립니다." 도와 주셔서 감사합니다. –

+0

내가 바꿀 것이 많습니다. 또한 pyglet의 OpenGL 인터페이스는 pyOpenGL보다 다른 언어에 더 가깝습니다. 어떤면에서는 pyOpenGL이 더 의미가 있기 때문에 더 좋지만 대부분 짜증나게합니다. 시작을 위해 c 유형을 가져올 필요가 없습니다. –

+0

그래, pyglet에는 자체 래퍼가 있습니다. pyglet 문서에서 인용 : 인터페이스는 pyglet.gl 패키지에 의해 제공됩니다. 그것을 사용하려면 OpenGL, C 및 ctype에 대한 지식이 필요합니다. ctypes을 사용하지 않고 OpenGL을 사용하는 것을 선호 할 수도 있습니다.이 경우 PyOpenGL을 조사해야합니다. PyOpenGL은 "Pythonic"인터페이스로 비슷한 기능을 제공하며 수정없이 pyglet과 함께 작동합니다. –

관련 문제