my $w = 128; my $h = 128; # Allocate texture buffer my($TextureID_FBO) = glGenTextures_p(1); # Allocate FBO frame and render buffers my($FrameBufferID) = glGenFramebuffersEXT_p(1); my($RenderBufferID) = glGenRenderbuffersEXT_p(1); # Bind frame/texture glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, $FrameBufferID); glBindTexture(GL_TEXTURE_2D, $TextureID_FBO); # Initiate texture glTexImage2D_c(GL_TEXTURE_2D, 0, GL_RGBA8, $w, $h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); # Bind frame/render buffers glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, $TextureID_FBO, 0); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, $RenderBufferID); glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, $w, $h); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, $RenderBufferID); # Test status #my $stat = glCheckFramebufferStatusEXT(GL_RENDERBUFFER_EXT); #printf("Status: %04X\n",$stat); # Draw to texture # TODO: add fragment shader to animate teapot glPushMatrix(); glTranslatef(-0.6, -0.8, 0.0); glutWireTeapot(0.25); glPopMatrix(); # Release binding glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); # Delete frame/render buffers # NOTE: Should cache to improve performance glDeleteRenderbuffersEXT_p( $RenderBufferID ); glDeleteFramebuffersEXT_p( $FrameBufferID );