bool Shader::PostLinkage() { GLint success; glGetProgramiv(m_program, GL_LINK_STATUS, &success); m_linked = (success == GL_TRUE); if (m_linked) { // Pour éviter de se tromper entre le nom et la constante #define CacheUniform(name) m_uniformLocations[ShaderUniform_##name] = glGetUniformLocation(m_program, #name) CacheUniform(InvProjMatrix); CacheUniform(InvTargetSize); CacheUniform(InvViewMatrix); CacheUniform(InvViewProjMatrix); CacheUniform(InvWorldMatrix); CacheUniform(InvWorldViewMatrix); CacheUniform(InvWorldViewProjMatrix); CacheUniform(ProjMatrix); CacheUniform(TargetSize); CacheUniform(ViewMatrix); CacheUniform(ViewProjMatrix); CacheUniform(WorldMatrix); CacheUniform(WorldViewMatrix); CacheUniform(WorldViewProjMatrix); #undef CacheUniform OnShaderUniformInvalidated(this); return true; } else { NazaraError("Failed to link shader: " + GetLog()); return false; } }
void NzMaterial::GenerateShader(nzUInt32 flags) const { NzParameterList list; list.SetParameter("ALPHA_MAPPING", m_alphaMap.IsValid()); list.SetParameter("ALPHA_TEST", m_alphaTestEnabled); list.SetParameter("COMPUTE_TBNMATRIX", m_normalMap.IsValid() || m_heightMap.IsValid()); list.SetParameter("DIFFUSE_MAPPING", m_diffuseMap.IsValid()); list.SetParameter("EMISSIVE_MAPPING", m_emissiveMap.IsValid()); list.SetParameter("LIGHTING", m_lightingEnabled); list.SetParameter("NORMAL_MAPPING", m_normalMap.IsValid()); list.SetParameter("PARALLAX_MAPPING", m_heightMap.IsValid()); list.SetParameter("SPECULAR_MAPPING", m_specularMap.IsValid()); list.SetParameter("TEXTURE_MAPPING", m_alphaMap.IsValid() || m_diffuseMap.IsValid() || m_emissiveMap.IsValid() || m_normalMap.IsValid() || m_heightMap.IsValid() || m_specularMap.IsValid()); list.SetParameter("TRANSFORM", m_transformEnabled); list.SetParameter("FLAG_DEFERRED", static_cast<bool>((flags & nzShaderFlags_Deferred) != 0)); list.SetParameter("FLAG_INSTANCING", static_cast<bool>((flags & nzShaderFlags_Instancing) != 0)); ShaderInstance& instance = m_shaders[flags]; instance.uberInstance = m_uberShader->Get(list); instance.shader = instance.uberInstance->GetShader(); #define CacheUniform(name) instance.uniforms[nzMaterialUniform_##name] = instance.shader->GetUniformLocation("Material" #name) CacheUniform(AlphaMap); CacheUniform(AlphaThreshold); CacheUniform(Ambient); CacheUniform(Diffuse); CacheUniform(DiffuseMap); CacheUniform(EmissiveMap); CacheUniform(HeightMap); CacheUniform(NormalMap); CacheUniform(Shininess); CacheUniform(Specular); CacheUniform(SpecularMap); #undef CacheUniform }