void CShadowHandler::LoadShadowGenShaderProgs() { shadowGenProgs.resize(SHADOWGEN_PROGRAM_LAST); static const std::string shadowGenProgNames[SHADOWGEN_PROGRAM_LAST] = { "ARB/unit_genshadow.vp", "ARB/groundshadow.vp", "ARB/treeShadow.vp", "ARB/treeFarShadow.vp", "ARB/projectileshadow.vp", }; static const std::string shadowGenProgHandles[SHADOWGEN_PROGRAM_LAST] = { "ShadowGenShaderProgModel", "ShadowGenshaderProgMap", "ShadowGenshaderProgTreeNear", "ShadowGenshaderProgTreeDist", "ShadowGenshaderProgProjectile", }; static const std::string shadowGenProgDefines[SHADOWGEN_PROGRAM_LAST] = { "#define SHADOWGEN_PROGRAM_MODEL\n", "#define SHADOWGEN_PROGRAM_MAP\n", "#define SHADOWGEN_PROGRAM_TREE_NEAR\n", "#define SHADOWGEN_PROGRAM_TREE_DIST\n", "#define SHADOWGEN_PROGRAM_PROJECTILE\n", }; CShaderHandler* sh = shaderHandler; if (globalRendering->haveGLSL) { for (int i = 0; i < SHADOWGEN_PROGRAM_LAST; i++) { Shader::IProgramObject* po = sh->CreateProgramObject("[ShadowHandler]", shadowGenProgHandles[i] + "GLSL", false); Shader::IShaderObject* so = sh->CreateShaderObject("GLSL/ShadowGenVertProg.glsl", shadowGenProgDefines[i], GL_VERTEX_SHADER); po->AttachShaderObject(so); po->Link(); po->SetUniformLocation("shadowParams"); po->SetUniformLocation("cameraDirX"); // used by SHADOWGEN_PROGRAM_TREE_NEAR po->SetUniformLocation("cameraDirY"); // used by SHADOWGEN_PROGRAM_TREE_NEAR po->SetUniformLocation("treeOffset"); // used by SHADOWGEN_PROGRAM_TREE_NEAR shadowGenProgs[i] = po; } } else { for (int i = 0; i < SHADOWGEN_PROGRAM_LAST; i++) { Shader::IProgramObject* po = sh->CreateProgramObject("[ShadowHandler]", shadowGenProgHandles[i] + "ARB", true); Shader::IShaderObject* so = sh->CreateShaderObject(shadowGenProgNames[i], "", GL_VERTEX_PROGRAM_ARB); po->AttachShaderObject(so); po->Link(); shadowGenProgs[i] = po; } } drawShadows = true; }
Shader::IProgramObject* CShaderHandler::CreateProgramObject( const std::string& poClass, const std::string& poName, const std::string& vsStr, const std::string& vsDefs, const std::string& fsStr, const std::string& fsDefs, bool arbProgram ) { Shader::IProgramObject* po = CreateProgramObject(poClass, poName, arbProgram); if (po->IsValid()) { return po; } Shader::IShaderObject* vso = CreateShaderObject(vsStr, vsDefs, (arbProgram? GL_VERTEX_PROGRAM_ARB: GL_VERTEX_SHADER)); Shader::IShaderObject* fso = CreateShaderObject(fsStr, fsDefs, (arbProgram? GL_FRAGMENT_PROGRAM_ARB: GL_FRAGMENT_SHADER)); po->AttachShaderObject(vso); po->AttachShaderObject(fso); po->Link(); if (!po->IsValid()) { logOutput.Print("[CShaderHandler::CreateProgramObject]\n"); logOutput.Print("\tprogram-object name: %s, link-log:\n%s\n", poName.c_str(), po->GetLog().c_str()); } return po; }
Shader::IProgramObject* CShaderHandler::CreateProgramObject( const std::string& poClass, const std::string& poName, const std::string& vsStr, const std::string& vsDefs, const std::string& fsStr, const std::string& fsDefs, bool arbProgram ) { Shader::IProgramObject* po = CreateProgramObject(poClass, poName, arbProgram); if (po->IsValid()) { return po; } Shader::IShaderObject* vso = CreateShaderObject(vsStr, vsDefs, (arbProgram? GL_VERTEX_PROGRAM_ARB: GL_VERTEX_SHADER)); Shader::IShaderObject* fso = CreateShaderObject(fsStr, fsDefs, (arbProgram? GL_FRAGMENT_PROGRAM_ARB: GL_FRAGMENT_SHADER)); po->AttachShaderObject(vso); po->AttachShaderObject(fso); po->Link(); po->Validate(); if (!po->IsValid()) { const char* fmt = "[%s]\n\tprogram-object name: %s, link-log:\n%s"; const char* log = po->GetLog().c_str(); LOG_L(L_WARNING, fmt, __FUNCTION__, poName.c_str(), log); } return po; }