Subversion Repositories gelsvn

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
676 janba 1
/*
2
 *  ShadowBuffer.cpp
3
 *  02564_Framework
4
 *
5
 *  Created by J. Andreas Bærentzen on 01/02/11.
6
 *  Copyright 2011 __MyCompanyName__. All rights reserved.
7
 *
8
 */
9
 
10
#include <iostream>
11
#include "ShadowBuffer.h"
12
 
13
using namespace std;
14
 
15
void ShadowBuffer::relinquish()
16
{
17
	glDeleteTextures(1, &dtex);
18
	glDeleteRenderbuffers(1, &rb);
19
	glDeleteFramebuffers(1, &fbo);
20
}
21
 
22
void ShadowBuffer::initialize()
23
{
24
	relinquish();
25
 
26
	glGenTextures(1, &dtex);
27
	glBindTexture(GL_TEXTURE_2D, dtex);
28
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
29
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
30
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
31
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
32
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
33
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
34
 
35
	glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, dim, dim, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0);
36
 
37
    glGenFramebuffers(1,&fbo);
38
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
39
 
40
 
41
    glGenRenderbuffers(1,&rb);
42
    glBindRenderbuffer(GL_RENDERBUFFER, rb);
43
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, dim, dim);
44
 
45
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
46
    glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, dtex, 0);
47
 
48
 
49
    if(glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
50
		cout << "Something wrong with FBO" << endl;
51
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
52
 
53
}
54
 
55
ShadowBuffer::ShadowBuffer(int _dim): dim(_dim), fbo(0), rb(0), dtex(0)
56
{
57
	initialize();
58
};
59
 
60
void ShadowBuffer::bind_textures(int dtex_unit)
61
{
62
	glActiveTexture(GL_TEXTURE0+dtex_unit);
63
	glBindTexture(GL_TEXTURE_2D, dtex);
64
}
65
 
66
GLint ShadowBuffer::enable()
67
{
68
	GLint old_draw_buffer;
69
	glGetIntegerv(GL_DRAW_BUFFER, &old_draw_buffer);
70
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
71
 
72
    glDrawBuffer(GL_COLOR_ATTACHMENT0);
73
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
74
	return old_draw_buffer;
75
}