示例#1
0
	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;
		}
	}
示例#2
0
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
}