You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
2.8 KiB
106 lines
2.8 KiB
////////////////////////////////////////////////////////////////////////////
|
|
// File: FrameBufferObject.cpp
|
|
// Author: Changchang Wu
|
|
// Description : Implementation of FrameBufferObject Class
|
|
//
|
|
//
|
|
//
|
|
// Copyright (c) 2007 University of North Carolina at Chapel Hill
|
|
// All Rights Reserved
|
|
//
|
|
// Permission to use, copy, modify and distribute this software and its
|
|
// documentation for educational, research and non-profit purposes, without
|
|
// fee, and without a written agreement is hereby granted, provided that the
|
|
// above copyright notice and the following paragraph appear in all copies.
|
|
//
|
|
// The University of North Carolina at Chapel Hill make no representations
|
|
// about the suitability of this software for any purpose. It is provided
|
|
// 'as is' without express or implied warranty.
|
|
//
|
|
// Please send BUG REPORTS to ccwu@cs.unc.edu
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#include "GL/glew.h"
|
|
#include <stdlib.h>
|
|
#include "GlobalUtil.h"
|
|
#include "FrameBufferObject.h"
|
|
|
|
//whether use only one FBO globally
|
|
int FrameBufferObject::UseSingleFBO=1;
|
|
GLuint FrameBufferObject::GlobalFBO=0;
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
FrameBufferObject::FrameBufferObject(int autobind)
|
|
{
|
|
if(UseSingleFBO && GlobalFBO)
|
|
{
|
|
_fboID = GlobalFBO;
|
|
}else
|
|
{
|
|
glGenFramebuffersEXT(1, &_fboID);
|
|
if(UseSingleFBO )GlobalFBO = _fboID;
|
|
}
|
|
if(autobind ) glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, _fboID);
|
|
}
|
|
|
|
FrameBufferObject::~FrameBufferObject()
|
|
{
|
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
|
if(!UseSingleFBO )
|
|
{
|
|
glDeleteFramebuffersEXT (1,&_fboID);
|
|
}
|
|
}
|
|
|
|
void FrameBufferObject::DeleteGlobalFBO()
|
|
{
|
|
if(UseSingleFBO)
|
|
{
|
|
glDeleteFramebuffersEXT (1,&GlobalFBO);
|
|
GlobalFBO = 0;
|
|
}
|
|
}
|
|
|
|
void FrameBufferObject::AttachDepthTexture(GLenum textureTarget, GLuint texID)
|
|
{
|
|
|
|
glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, textureTarget, texID, 0);
|
|
}
|
|
|
|
void FrameBufferObject::AttachTexture(GLenum textureTarget, GLenum attachment, GLuint texId)
|
|
{
|
|
glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, attachment, textureTarget, texId, 0);
|
|
}
|
|
|
|
void FrameBufferObject::BindFBO()
|
|
{
|
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, _fboID);
|
|
}
|
|
|
|
void FrameBufferObject::UnbindFBO()
|
|
{
|
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
|
}
|
|
|
|
void FrameBufferObject::UnattachTex(GLenum attachment)
|
|
{
|
|
glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, attachment, GL_TEXTURE_2D, 0, 0 );
|
|
}
|
|
|
|
void FrameBufferObject::AttachRenderBuffer(GLenum attachment, GLuint buffID)
|
|
{
|
|
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attachment, GL_RENDERBUFFER_EXT, buffID);
|
|
|
|
}
|
|
|
|
void FrameBufferObject:: UnattachRenderBuffer(GLenum attachment)
|
|
{
|
|
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attachment, GL_RENDERBUFFER_EXT, 0);
|
|
}
|
|
|