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 = XenkoTessellationMethod.AdjacentEdgeAverage; context.AddFinalCallback(MaterialShaderStage.Domain, AddAdjacentEdgeAverageMacros); context.AddFinalCallback(MaterialShaderStage.Domain, AddAdjacentEdgeAverageShaders); } }
public void AddAdjacentEdgeAverageShaders(MaterialShaderStage stage, MaterialGeneratorContext context) { var tessellationShader = context.Parameters.Get(MaterialKeys.TessellationShader) as ShaderMixinSource; if (tessellationShader == null) { return; } if (context.GetStreamFinalModifier <MaterialDisplacementMapFeature>(MaterialShaderStage.Domain) != null) { tessellationShader.Mixins.Add(new ShaderClassSource("TessellationAE2", "TexCoord")); // this suppose Displacement from Texture -> TODO make it more flexible so that it works with any kind of displacement. tessellationShader.Mixins.Add(new ShaderClassSource("TessellationAE3", "normalWS")); } }