#include "WorldShadowShader.h" #include "../Wrapper.h" WorldShadowShader::WorldShadowShader() { } WorldShadowShader::~WorldShadowShader() { glDeleteFramebuffers(1, &framebuffer); glDeleteTextures(1, &depthTexture); } bool WorldShadowShader::init() { program.compile("shader/worldShadowVertex.vs", "shader/worldShadowFragment.fs"); if(!program.isValid()) { return false; } // generate framebuffer glGenFramebuffers(1, &framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); glDrawBuffer(GL_NONE); glReadBuffer(GL_NONE); // depth texture glGenTextures(1, &depthTexture); glBindTexture(GL_TEXTURE_2D, depthTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, Engine::getWidth(), Engine::getHeight(), 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); // attache depth texture to framebuffer glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture, 0); // check if framebuffer is okay if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { cout << "world shadow frame buffer is not complete!" << endl; return false; } // unbind framebuffer glBindFramebuffer(GL_FRAMEBUFFER, 0); // get uniform locations unifProjMatrix = glGetUniformLocation(program.getProgram(), "projMatrix"); unifViewMatrix = glGetUniformLocation(program.getProgram(), "viewMatrix"); unifModelMatrix = glGetUniformLocation(program.getProgram(), "modelMatrix"); return true; } void WorldShadowShader::resize() { glBindTexture(GL_TEXTURE_2D, depthTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, Engine::getWidth(), Engine::getHeight(), 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL); } void WorldShadowShader::preRender(const float* projMatrix) { // bind world shadow shader program glUseProgram(program.getProgram()); // set projection matrix uniform glUniformMatrix4fv(unifProjMatrix, 1, 0, projMatrix); // bind world framebuffer glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); // clear color, depth and stencil buffer glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // no color, depth testing is needed glEnable(GL_DEPTH_TEST); } void WorldShadowShader::bindDepthTexture(unsigned int textureUnit) { glActiveTexture(GL_TEXTURE0 + textureUnit); glBindTexture(GL_TEXTURE_2D, depthTexture); } void WorldShadowShader::setViewMatrix(const float* data) { glUniformMatrix4fv(unifViewMatrix, 1, 0, data); } void WorldShadowShader::setModelMatrix(const float* data) { glUniformMatrix4fv(unifModelMatrix, 1, 0, data); }