/* struct SurfaceOutput { half3 Albedo; half3 Normal; half3 Emission; half Specular; half Gloss; half Alpha; }; */ public ShaderCodeBuilder(MaterialContainer mc, MeshContainer mesh) { float f1 = 1; f1.GetType(); _normalizeNormals = true; if (mesh != null) AnalyzeMesh(mesh); else { _hasVertices = _hasNormals = _hasUVs = true; } AnalyzeMaterial(mc); StringBuilder vs = new StringBuilder(); MeshInputDeclarations(vs); MatrixDeclarations(vs); VSBody(vs); _vs = vs.ToString(); StringBuilder ps = new StringBuilder(); PixelInputDeclarations(ps); PSBody(ps); _ps = ps.ToString(); }
private void AnalyzeMaterial(MaterialContainer mc) { _hasDiffuse = mc.HasDiffuse; if (_hasDiffuse) _hasDiffuseTexture = (mc.Diffuse.Texture != null); _hasSpecular = mc.HasSpecular; if (_hasSpecular) _hasSpecularTexture = (mc.Specular.Texture != null); _hasEmissive = mc.HasEmissive; if (_hasEmissive) _hasEmissiveTexture = (mc.Emissive.Texture != null); _hasBump = mc.HasBump; // always has a texture... }
private ShaderEffect LookupMaterial(MaterialContainer mc) { ShaderEffect mat; if (!_matMap.TryGetValue(mc, out mat)) { mat = MakeMaterial(mc); mat.AttachToContext(_rc); _matMap.Add(mc, mat); } return mat; }
private ShaderEffect MakeMaterial(MaterialContainer mc) { ShaderCodeBuilder scb = new ShaderCodeBuilder(mc, null); var effectParameters = AssembleEffectParamers(mc, scb); ShaderEffect ret = new ShaderEffect(new [] { new EffectPassDeclaration() { VS = scb.VS, PS = scb.PS, StateSet = new RenderStateSet() { ZEnable = true, AlphaBlendEnable = false } } }, effectParameters ); return ret; }
private List<EffectParameterDeclaration> AssembleEffectParamers(MaterialContainer mc, ShaderCodeBuilder scb) { List<EffectParameterDeclaration> effectParameters = new List<EffectParameterDeclaration>(); if (mc.HasDiffuse) { effectParameters.Add(new EffectParameterDeclaration { Name = scb.DiffuseColorName, Value = (object) mc.Diffuse.Color }); if (mc.Diffuse.Texture != null) { effectParameters.Add(new EffectParameterDeclaration { Name = scb.DiffuseMixName, Value = mc.Diffuse.Mix }); effectParameters.Add(new EffectParameterDeclaration { Name = scb.DiffuseTextureName, Value = LoadTexture(mc.Diffuse.Texture) }); } } if (mc.HasSpecular) { effectParameters.Add(new EffectParameterDeclaration { Name = scb.SpecularColorName, Value = (object) mc.Specular.Color }); effectParameters.Add(new EffectParameterDeclaration { Name = scb.SpecularShininessName, Value = (object) mc.Specular.Shininess }); effectParameters.Add(new EffectParameterDeclaration { Name = scb.SpecularIntensityName, Value = (object) mc.Specular.Intensity }); if (mc.Specular.Texture != null) { effectParameters.Add(new EffectParameterDeclaration { Name = scb.SpecularMixName, Value = mc.Specular.Mix }); effectParameters.Add(new EffectParameterDeclaration { Name = scb.SpecularTextureName, Value = LoadTexture(mc.Specular.Texture) }); } } if (mc.HasEmissive) { effectParameters.Add(new EffectParameterDeclaration { Name = scb.EmissiveColorName, Value = (object) mc.Emissive.Color }); if (mc.Emissive.Texture != null) { effectParameters.Add(new EffectParameterDeclaration { Name = scb.EmissiveMixName, Value = mc.Emissive.Mix }); effectParameters.Add(new EffectParameterDeclaration { Name = scb.EmissiveTextureName, Value = LoadTexture(mc.Emissive.Texture) }); } } if (mc.HasBump) { effectParameters.Add(new EffectParameterDeclaration { Name = scb.BumpIntensityName, Value = mc.Bump.Intensity }); effectParameters.Add(new EffectParameterDeclaration { Name = scb.BumpTextureName, Value = LoadTexture(mc.Bump.Texture) }); } // Any light calculation needed at all? if (mc.HasDiffuse || mc.HasSpecular) { // Light calculation parameters effectParameters.Add(new EffectParameterDeclaration { Name = ShaderCodeBuilder.LightColorName, Value = new float3(1, 1, 1) }); effectParameters.Add(new EffectParameterDeclaration { Name = ShaderCodeBuilder.LightIntensityName, Value = (float) 1 }); effectParameters.Add(new EffectParameterDeclaration { Name = ShaderCodeBuilder.LightDirectionName, Value = new float3(0, 0, 1) }); } return effectParameters; }