Subversion Repositories gelsvn

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

/*
 *  ShadowBuffer.cpp
 *  02564_Framework
 *
 *  Created by J. Andreas Bærentzen on 01/02/11.
 *  Copyright 2011 __MyCompanyName__. All rights reserved.
 *
 */

#include <iostream>
#include "ShadowBuffer.h"

using namespace std;

void ShadowBuffer::relinquish()
{
        glDeleteTextures(1, &dtex);
        glDeleteRenderbuffers(1, &rb);
        glDeleteFramebuffers(1, &fbo);
}

void ShadowBuffer::initialize()
{
        relinquish();
        
        glGenTextures(1, &dtex);
        glBindTexture(GL_TEXTURE_2D, dtex);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
        
        glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, dim, dim, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0);
        
    glGenFramebuffers(1,&fbo);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
        
        
    glGenRenderbuffers(1,&rb);
    glBindRenderbuffer(GL_RENDERBUFFER, rb);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, dim, dim);
        
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
    glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, dtex, 0);
        
        
    if(glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
                cout << "Something wrong with FBO" << endl;
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
        
}

ShadowBuffer::ShadowBuffer(int _dim): dim(_dim), fbo(0), rb(0), dtex(0)
{
        initialize();
};

void ShadowBuffer::bind_textures(int dtex_unit)
{
        glActiveTexture(GL_TEXTURE0+dtex_unit);
        glBindTexture(GL_TEXTURE_2D, dtex);
}

GLint ShadowBuffer::enable()
{
        GLint old_draw_buffer;
        glGetIntegerv(GL_DRAW_BUFFER, &old_draw_buffer);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
        
    glDrawBuffer(GL_COLOR_ATTACHMENT0);
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        return old_draw_buffer;
}