Program Listing for File ShadowMap.cpp
↰ Return to documentation for file (Src/GraphicsEngineOpenGL/scene/shadows/ShadowMap.cpp
)
#include "scene/shadows/ShadowMap.hpp"
#include <stdio.h>
ShadowMap::ShadowMap()
:
FBO(0), shadow_map(0), shadow_width(0), shadow_height(0)
{}
bool ShadowMap::init(GLuint width, GLuint height)
{
shadow_width = width;
shadow_height = height;
glGenFramebuffers(1, &FBO);
glGenTextures(1, &shadow_map);
glBindTexture(GL_TEXTURE_2D, shadow_map);
glTexImage2D(
GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, shadow_width, shadow_height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
float border_color[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, shadow_map, 0);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
printf("Framebuffer error: %i\n", status);
return false;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
return true;
}
void ShadowMap::write() { glBindFramebuffer(GL_FRAMEBUFFER, FBO); }
void ShadowMap::read(GLenum texture_unit)
{
glActiveTexture(texture_unit);
glBindTexture(GL_TEXTURE_2D, shadow_map);
}
ShadowMap::~ShadowMap()
{
if (FBO) { glDeleteFramebuffers(1, &FBO); }
if (shadow_map) { glDeleteTextures(1, &shadow_map); }
}