1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #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);
- }
|