class FramebufferTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.window = helper.initAndGetWindow()

    @classmethod
    def tearDownClass(cls):
        glfw.terminate()

    def testFramebuffer(self):
        self.framebuffer = Framebuffer()
        self.framebuffer.bind()
        depthbuffer = Depthbuffer()
        depthbuffer.create(100, 100)
        depthbuffer.attach()
        self.framebuffer.checkComplete()
        self.assertEqual(self.framebuffer.getId(), 1)

    def testFramebuffer(self):
        self.framebuffer = Framebuffer()
        self.framebuffer.bind()
        self.assertRaises(RuntimeError, self.framebuffer.checkComplete)
示例#2
0
class HDRbuffer:
    def create(self, width, height):
        self.width = width
        self.height = height
        self.__createFBO()
        self.__createMultisampleFBO()

    def __createFBO(self):
        self.hdrFBO = Framebuffer()
        self.hdrFBO.bind()
        self.colorBuffers = glGenTextures(2)
        for i in range(2):
            glBindTexture(GL_TEXTURE_2D, self.colorBuffers[i])
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, self.width, self.height,
                         0, GL_RGB, GL_FLOAT, None)
            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
                                   GL_TEXTURE_2D, self.colorBuffers[i], 0)

        self.rboDepth = glGenRenderbuffers(1)
        glBindRenderbuffer(GL_RENDERBUFFER, self.rboDepth)
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, self.width,
                              self.height)
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                                  GL_RENDERBUFFER, self.rboDepth)
        glDrawBuffers(2, [GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1])
        self.hdrFBO.checkComplete()

    def __createMultisampleFBO(self):
        self.__hdrFBO_MS = Framebuffer()
        self.__hdrFBO_MS.bind()
        self.__colorBuffersMS = glGenTextures(2)
        for i in range(2):
            glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, self.__colorBuffersMS[i])
            glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE,
                                    config['sampling_level'], GL_RGB16F,
                                    self.width, self.height, GL_TRUE)
            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
                                   GL_TEXTURE_2D_MULTISAMPLE,
                                   self.__colorBuffersMS[i], 0)

        self.__rboDepthMS = glGenRenderbuffers(1)
        glBindRenderbuffer(GL_RENDERBUFFER, self.__rboDepthMS)
        glRenderbufferStorageMultisample(GL_RENDERBUFFER,
                                         config['sampling_level'],
                                         GL_DEPTH_COMPONENT, self.width,
                                         self.height)
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                                  GL_RENDERBUFFER, self.__rboDepthMS)
        glDrawBuffers(2, [GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1])
        self.__hdrFBO_MS.checkComplete()

    def bind(self):
        self.__hdrFBO_MS.bind()

    def finalize(self):
        glBindFramebuffer(GL_READ_FRAMEBUFFER, self.__hdrFBO_MS.getId())
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, self.hdrFBO.getId())
        for i in range(2):
            glReadBuffer(GL_COLOR_ATTACHMENT0 + i)
            glDrawBuffer(GL_COLOR_ATTACHMENT0 + i)
            glBlitFramebuffer(0, 0, self.width, self.height, 0, 0, self.width,
                              self.height, GL_COLOR_BUFFER_BIT, GL_NEAREST)
        glBindFramebuffer(GL_READ_FRAMEBUFFER, 0)
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0)
        glBindFramebuffer(GL_FRAMEBUFFER, 0)

    def unbind(self):
        self.__hdrFBO_MS.unbind()

    def __del__(self):
        self.delete()

    def delete(self):
        self.hdrFBO.delete()
        self.__hdrFBO_MS.delete()
        try:
            glDeleteRenderbuffers(1, self.rboDepth)
            glDeleteRenderbuffers(1, self.rboDepthMS)
            glDeleteTextures(2, self.colorBuffers)
            glDeleteTextures(2, self.__colorBuffersMS)
            self.colorBuffers, self.__colorBuffersMS = 0, 0
            self.rboDepth, self.rboDepthMS = 0, 0
        except (NullFunctionError, TypeError):
            pass