public override void VisitFeature(MaterialGeneratorContext context) { // determine if an tessellation material have already been added in another layer HasAlreadyTessellationFeature = context.GetStreamFinalModifier <MaterialTessellationBaseFeature>(MaterialShaderStage.Domain) != null; // Notify problem on multiple tessellation techniques and return if (HasAlreadyTessellationFeature) { context.Log.Warning("A material cannot have more than one layer performing tessellation. The first tessellation method found, will be used."); return; } // reset the tessellation stream at the beginning of the stage context.AddStreamInitializer(MaterialShaderStage.Domain, "MaterialTessellationStream"); // set the desired triangle size desired for this material context.Parameters.Set(TessellationKeys.DesiredTriangleSize, TriangleSize); // set the tessellation method and callback to add Displacement/Normal average shaders. if (AdjacentEdgeAverage && !context.Tags.Get(HasFinalCallback)) { context.Tags.Set(HasFinalCallback, true); context.Material.TessellationMethod = ParadoxTessellationMethod.AdjacentEdgeAverage; context.AddFinalCallback(MaterialShaderStage.Domain, AddAdjacentEdgeAverageMacros); context.AddFinalCallback(MaterialShaderStage.Domain, AddAdjacentEdgeAverageShaders); } }
public void Visit(MaterialGeneratorContext context) { var alpha = Alpha ?? new ComputeFloat(0.5f); var tint = Tint ?? new ComputeColor(Color.White); // Use pre-multiplied alpha to support both additive and alpha blending var blendDesc = new BlendStateDescription(Blend.One, Blend.InverseSourceAlpha); context.Material.HasTransparency = true; context.Parameters.Set(Effect.BlendStateKey, BlendState.NewFake(blendDesc)); var alphaColor = alpha.GenerateShaderSource(context, new MaterialComputeColorKeys(MaterialKeys.DiffuseSpecularAlphaBlendMap, MaterialKeys.DiffuseSpecularAlphaBlendValue, Color.White)); var mixin = new ShaderMixinSource(); mixin.Mixins.Add(new ShaderClassSource("ComputeColorMaterialAlphaBlend")); mixin.AddComposition("color", alphaColor); context.SetStream(MaterialShaderStage.Pixel, AlphaBlendStream.Stream, MaterialStreamType.Float2, mixin); context.SetStream(AlphaBlendColorStream.Stream, tint, MaterialKeys.AlphaBlendColorMap, MaterialKeys.AlphaBlendColorValue, Color.White); if (!context.Tags.Get(HasFinalCallback)) { context.Tags.Set(HasFinalCallback, true); context.AddFinalCallback(MaterialShaderStage.Pixel, AddDiffuseSpecularAlphaBlendColor); } }
public override void VisitFeature(MaterialGeneratorContext context) { var alpha = Alpha ?? new ComputeFloat(DefaultAlpha); context.SetStream(AlphaDiscardStream.Stream, alpha, MaterialKeys.AlphaDiscardMap, MaterialKeys.AlphaDiscardValue, new Color(DefaultAlpha)); if (!context.Tags.Get(HasFinalCallback)) { context.Tags.Set(HasFinalCallback, true); context.AddFinalCallback(MaterialShaderStage.Pixel, AddDiscardFromLuminance); } }
public override void VisitFeature(MaterialGeneratorContext context) { var alpha = Alpha ?? new ComputeFloat(1f); var tint = Tint ?? new ComputeColor(Color.White); // Use pre-multiplied alpha to support both additive and alpha blending var blendDesc = new BlendStateDescription(Blend.One, Blend.InverseSourceAlpha); context.Material.HasTransparency = true; context.Parameters.Set(Effect.BlendStateKey, BlendState.NewFake(blendDesc)); context.SetStream(AlphaBlendStream.Stream, alpha, MaterialKeys.DiffuseSpecularAlphaBlendMap, MaterialKeys.DiffuseSpecularAlphaBlendValue, Color.White); context.SetStream(AlphaBlendColorStream.Stream, tint, MaterialKeys.AlphaBlendColorMap, MaterialKeys.AlphaBlendColorValue, Color.White); if (!context.Tags.Get(HasFinalCallback)) { context.Tags.Set(HasFinalCallback, true); context.AddFinalCallback(MaterialShaderStage.Pixel, AddDiffuseSpecularAlphaBlendColor); } }