1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
void ShadowMappingManager::Init()
{
m_WindowWidth = Application::Instance().m_Settings.m_ScreenWidth ;
m_WindowHeight = Application::Instance().m_Settings.m_ScreenHeight ;
//Check for necessary extensions
if ( !glewIsSupported("GL_ARB_depth_texture"))
std::cout << "ARB texture *not* supported" << std::endl ;
if ( !glewIsSupported("GL_ARB_shadow"))
std::cout << "Shadow *not* supported" << std::endl ;
if ( !glewIsSupported("GL_EXT_framebuffer_object"))
std::cout << "FBO *not* supported" << std::endl ;
// Creation of a depth-texture
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
//glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
//glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
glGenTextures(1, &m_ShadowMapTexture);
glBindTexture(GL_TEXTURE_2D, m_ShadowMapTexture);
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_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, m_ShadowMapSize, m_ShadowMapSize, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
// Creation of a fbo to get the depth
glGenFramebuffersEXT(1, &m_ShadowMapFBO);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_ShadowMapFBO);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_ShadowMapTexture, 0);
// No color buffer to draw to or read from
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
// Check framebuffer completeness at the end of initialization.
CHECK_FBO_STATUS() ;
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glActiveTexture(GL_TEXTURE0);
GLfloat white[]= { 1.0f, 1.0f, 1.0f, 1.0f };
Vector3D<float> LightPos = Vector3D<float>(1.0f, 1.0f,1.0f);
float LP[3];
LP[0] = LightPos.x ;
LP[1] = LightPos.y ;
LP[2] = LightPos.z ;
glLightfv(GL_LIGHT0, GL_POSITION, LP);
glLightfv(GL_LIGHT0, GL_SPECULAR,white);
glLightfv(GL_LIGHT0, GL_AMBIENT,white);
glLightfv(GL_LIGHT0, GL_DIFFUSE,white);
// Load the shader
ShaderManager::Instance().LoadShaders("ShadowMapping","sm.vert","sm.frag");
Loc_Dif = ShaderManager::Instance().AddUniformVariable("ShadowMapping","diffuse");
Loc_Shad = ShaderManager::Instance().AddUniformVariable("ShadowMapping","shadow0");
ShaderManager::Instance().SetUniformVariableValue1i("ShadowMapping",Loc_Dif,0);
ShaderManager::Instance().SetUniformVariableValue1i("ShadowMapping",Loc_Shad,1);
} |