bool UnitDrawerStateARB::Init(const CUnitDrawer* ud) { if (!globalRendering->haveARB) { // not possible to do (ARB) shader-based model rendering return false; } if (!configHandler->GetBool("AdvUnitShading")) { // not allowed to do (ARB) shader-based model rendering return false; } // if GLEW_NV_vertex_program2 is supported, transparent objects are clipped against GL_CLIP_PLANE3 const char* vertProgNamesARB[2] = {"ARB/units3o.vp", "ARB/units3o2.vp"}; const char* fragProgNamesARB[2] = {"ARB/units3o.fp", "ARB/units3o_shadow.fp"}; #define sh shaderHandler modelShaders[MODEL_SHADER_NOSHADOW_STANDARD] = sh->CreateProgramObject("[UnitDrawer]", "S3OShaderDefARB", true); modelShaders[MODEL_SHADER_NOSHADOW_STANDARD]->AttachShaderObject(sh->CreateShaderObject(vertProgNamesARB[GLEW_NV_vertex_program2], "", GL_VERTEX_PROGRAM_ARB)); modelShaders[MODEL_SHADER_NOSHADOW_STANDARD]->AttachShaderObject(sh->CreateShaderObject(fragProgNamesARB[0], "", GL_FRAGMENT_PROGRAM_ARB)); modelShaders[MODEL_SHADER_NOSHADOW_STANDARD]->Link(); modelShaders[MODEL_SHADER_SHADOWED_STANDARD] = sh->CreateProgramObject("[UnitDrawer]", "S3OShaderAdvARB", true); modelShaders[MODEL_SHADER_SHADOWED_STANDARD]->AttachShaderObject(sh->CreateShaderObject(vertProgNamesARB[GLEW_NV_vertex_program2], "", GL_VERTEX_PROGRAM_ARB)); modelShaders[MODEL_SHADER_SHADOWED_STANDARD]->AttachShaderObject(sh->CreateShaderObject(fragProgNamesARB[1], "", GL_FRAGMENT_PROGRAM_ARB)); modelShaders[MODEL_SHADER_SHADOWED_STANDARD]->Link(); // make the active shader non-NULL SetActiveShader(shadowHandler->ShadowsLoaded(), false); #undef sh return true; }
void IUnitDrawerState::DisableCommon(const CUnitDrawer* ud, bool deferredPass) { assert(modelShaders[MODEL_SHADER_ACTIVE] != nullptr); modelShaders[MODEL_SHADER_ACTIVE]->Disable(); SetActiveShader(shadowHandler->ShadowsLoaded(), deferredPass); DisableTexturesCommon(); PopTransform(); }
void IUnitDrawerState::EnableCommon(const CUnitDrawer* ud, bool deferredPass) { PushTransform(camera); EnableTexturesCommon(); SetActiveShader(shadowHandler->ShadowsLoaded(), deferredPass); assert(modelShaders[MODEL_SHADER_ACTIVE] != nullptr); modelShaders[MODEL_SHADER_ACTIVE]->Enable(); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); }
void FShaderManager::Clean() { SetActiveShader(NULL); for(unsigned int i=0;i<mTextureEffects.Size();i++) { if (mTextureEffects[i] != NULL) delete mTextureEffects[i]; } for(int i=0;i<NUM_EFFECTS;i++) { if (mEffectShaders[i] != NULL) delete mEffectShaders[i]; mEffectShaders[i] = NULL; } mTextureEffects.Clear(); }
bool UnitDrawerStateGLSL::Init(const CUnitDrawer* ud) { if (!globalRendering->haveGLSL) { // not possible to do (GLSL) shader-based model rendering return false; } if (!configHandler->GetBool("AdvUnitShading")) { // not allowed to do (GLSL) shader-based model rendering return false; } #define sh shaderHandler const GL::LightHandler* lightHandler = ud->GetLightHandler(); const std::string shaderNames[MODEL_SHADER_COUNT - 1] = { "ModelShaderGLSL-NoShadowStandard", "ModelShaderGLSL-ShadowedStandard", "ModelShaderGLSL-NoShadowDeferred", "ModelShaderGLSL-ShadowedDeferred", }; const std::string extraDefs = ("#define BASE_DYNAMIC_MODEL_LIGHT " + IntToString(lightHandler->GetBaseLight()) + "\n") + ("#define MAX_DYNAMIC_MODEL_LIGHTS " + IntToString(lightHandler->GetMaxLights()) + "\n"); for (unsigned int n = MODEL_SHADER_NOSHADOW_STANDARD; n <= MODEL_SHADER_SHADOWED_DEFERRED; n++) { modelShaders[n] = sh->CreateProgramObject("[UnitDrawer]", shaderNames[n], false); modelShaders[n]->AttachShaderObject(sh->CreateShaderObject("GLSL/ModelVertProg.glsl", extraDefs, GL_VERTEX_SHADER)); modelShaders[n]->AttachShaderObject(sh->CreateShaderObject("GLSL/ModelFragProg.glsl", extraDefs, GL_FRAGMENT_SHADER)); modelShaders[n]->SetFlag("USE_SHADOWS", int((n & 1) == 1)); modelShaders[n]->SetFlag("DEFERRED_MODE", int(n >= MODEL_SHADER_NOSHADOW_DEFERRED)); modelShaders[n]->SetFlag("GBUFFER_NORMTEX_IDX", GL::GeometryBuffer::ATTACHMENT_NORMTEX); modelShaders[n]->SetFlag("GBUFFER_DIFFTEX_IDX", GL::GeometryBuffer::ATTACHMENT_DIFFTEX); modelShaders[n]->SetFlag("GBUFFER_SPECTEX_IDX", GL::GeometryBuffer::ATTACHMENT_SPECTEX); modelShaders[n]->SetFlag("GBUFFER_EMITTEX_IDX", GL::GeometryBuffer::ATTACHMENT_EMITTEX); modelShaders[n]->SetFlag("GBUFFER_MISCTEX_IDX", GL::GeometryBuffer::ATTACHMENT_MISCTEX); modelShaders[n]->SetFlag("GBUFFER_ZVALTEX_IDX", GL::GeometryBuffer::ATTACHMENT_ZVALTEX); modelShaders[n]->Link(); modelShaders[n]->SetUniformLocation("diffuseTex"); // idx 0 (t1: diffuse + team-color) modelShaders[n]->SetUniformLocation("shadingTex"); // idx 1 (t2: spec/refl + self-illum) modelShaders[n]->SetUniformLocation("shadowTex"); // idx 2 modelShaders[n]->SetUniformLocation("reflectTex"); // idx 3 (cube) modelShaders[n]->SetUniformLocation("specularTex"); // idx 4 (cube) modelShaders[n]->SetUniformLocation("sunDir"); // idx 5 modelShaders[n]->SetUniformLocation("cameraPos"); // idx 6 modelShaders[n]->SetUniformLocation("cameraMat"); // idx 7 modelShaders[n]->SetUniformLocation("cameraMatInv"); // idx 8 modelShaders[n]->SetUniformLocation("teamColor"); // idx 9 modelShaders[n]->SetUniformLocation("nanoColor"); // idx 10 modelShaders[n]->SetUniformLocation("sunAmbient"); // idx 11 modelShaders[n]->SetUniformLocation("sunDiffuse"); // idx 12 modelShaders[n]->SetUniformLocation("shadowDensity"); // idx 13 modelShaders[n]->SetUniformLocation("shadowMatrix"); // idx 14 modelShaders[n]->SetUniformLocation("shadowParams"); // idx 15 // modelShaders[n]->SetUniformLocation("alphaPass"); // idx 16 modelShaders[n]->Enable(); modelShaders[n]->SetUniform1i(0, 0); // diffuseTex (idx 0, texunit 0) modelShaders[n]->SetUniform1i(1, 1); // shadingTex (idx 1, texunit 1) modelShaders[n]->SetUniform1i(2, 2); // shadowTex (idx 2, texunit 2) modelShaders[n]->SetUniform1i(3, 3); // reflectTex (idx 3, texunit 3) modelShaders[n]->SetUniform1i(4, 4); // specularTex (idx 4, texunit 4) modelShaders[n]->SetUniform3fv(5, &sky->GetLight()->GetLightDir().x); modelShaders[n]->SetUniform3fv(6, &camera->GetPos()[0]); modelShaders[n]->SetUniformMatrix4fv(7, false, camera->GetViewMatrix()); modelShaders[n]->SetUniformMatrix4fv(8, false, camera->GetViewMatrixInverse()); modelShaders[n]->SetUniform4f(9, 0.0f, 0.0f, 0.0f, 0.0f); modelShaders[n]->SetUniform4f(10, 0.0f, 0.0f, 0.0f, 0.0f); modelShaders[n]->SetUniform3fv(11, &sunLighting->modelAmbientColor[0]); modelShaders[n]->SetUniform3fv(12, &sunLighting->modelDiffuseColor[0]); modelShaders[n]->SetUniform1f(13, sunLighting->modelShadowDensity); modelShaders[n]->SetUniformMatrix4fv(14, false, shadowHandler->GetShadowMatrixRaw()); modelShaders[n]->SetUniform4fv(15, &(shadowHandler->GetShadowParams().x)); // modelShaders[n]->SetUniform1f(16, 0.0f); // alphaPass modelShaders[n]->Disable(); modelShaders[n]->Validate(); } // make the active shader non-NULL SetActiveShader(shadowHandler->ShadowsLoaded(), false); #undef sh return true; }