0

正射投影をテクスチャにレンダリングしたいと考えています。

メッシュのレンダリングはうまく機能していますが、FrameBuffer を追加すると画面が真っ暗のままになります。

FBO を作成します。

def createFBO(self):
    self.fbo = glGenFramebuffersEXT(1)
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, self.fbo)
    self.depthbuffer = glGenRenderbuffersEXT(1)
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, self.depthbuffer)
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, width, height)
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, self.depthbuffer)
    ''' create the texture and bind it to the framebuffer '''
    self.texture = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, self.texture)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,  width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, None);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,  GL_TEXTURE_2D, self.texture, 0);

オブジェクトをレンダリングします。

def renderMesh(self):
    #glViewport(0, 0, width, height);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-64, 64, -64, 64, 1.0, 1000.0);

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(64,64,100,64,64,-1,0,-1,0)

    if True:
        glEnable(GL_CLIP_PLANE0)
        glEnable(GL_CLIP_PLANE1)
        glClipPlane(GL_CLIP_PLANE0, (0,0,1,-1 * self.start + self.diff))       
        glClipPlane(GL_CLIP_PLANE1, (0,0,-1,self.start)) 

    #glClearColor(0.5,0.5,0.75,1.0)
    # render the mesh
    #glTranslatef(-64,-64,-64)
    glEnableClientState(GL_VERTEX_ARRAY) # Enable something in OpenGL 
    glEnableClientState(GL_COLOR_ARRAY) # Enable something in OpenGL
    glBindBuffer(GL_ARRAY_BUFFER,self.vbo[1]) 
    glColorPointer(3,GL_FLOAT,0,None) # Tell OpenGL that it contains only ColorValues
    #Now the vertex Buffer with positions
    glBindBuffer(GL_ARRAY_BUFFER,self.vbo[0]) 
    glVertexPointer(3,GL_FLOAT,0,None) # Tell OpenGL that it contains the Positions for each Points
    glDrawArrays(GL_TRIANGLES,0,len(self.verts)+len(self.color))    # Merge both

    glDisableClientState(GL_COLOR_ARRAY); 
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisable(GL_CLIP_PLANE0)
    glDisable(GL_CLIP_PLANE1)

テクスチャをレンダリングする:

   def renderPlaneWithTexture(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluPerspective(45.0,1.0*width/height,1.0,1000.0)
        glMatrixMode(GL_MODELVIEW)
        gluLookAt(0,0,1,0,0,0,0,1,0)
        glClearColor(0,0,0,0)        
        glEnable(GL_TEXTURE_2D)
        glBegin(GL_QUADS)        
        glNormal3f(0.0, 1.0, 0.0)
        glTexCoord2f(0.0, 0.0)
        glVertex3f(-1, 1, -1)
        glTexCoord2f(1.0, 0.0)
        glVertex3f(1, 1, -1)
        glTexCoord2f(1.0, 1.0)
        glVertex3f(1, -1, -1)
        glTexCoord2f(0.0, 1.0)
        glVertex3f(-1, -1, -1)    
        glEnd();
        glDisable(GL_TEXTURE_2D)

メインゲームループ:

glClearColor(0.0,0.0,0.0,1.0)
if self.useFBO:        
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, self.fbo);   
    self.renderMesh()
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
    self.renderPlaneWithTexture()
else:
    self.renderMesh()
pygame.display.flip()

どこで問題が発生していますか?render to texture を使用しているときに renderWindow がまだ黒いのはなぜですか? テクスチャにレンダリングしなくても、すべて正常に動作します...

4

1 に答える 1

3

FBO にレンダリングする前に、FBO のカラー アタッチメントとしてアタッチされたテクスチャをアンバインドする必要があります。FBO をバインドする前に、バインドを解除するのが理想的です。バインド解除は、テクスチャ ID 0 をバインドすることによって行われます

于 2012-09-15T13:56:24.380 に答える