private void BlendShadingModel(MaterialBlendLayerContext parent, MaterialBlendLayerPerStageContext pendingPixelLayerContext, MaterialBlendLayerPerStageContext parentPixelLayerContext) { var shaderBlendingSource = new ShaderMixinSource(); shaderBlendingSource.Mixins.Add(new ShaderClassSource("MaterialSurfaceShadingBlend")); parent.SetStreamBlend(MaterialShaderStage.Pixel, parent.BlendMapForShadingModel); // Add shader source already setup for the parent foreach (var shaderSource in pendingPixelLayerContext.ShaderSources) { shaderBlendingSource.AddCompositionToArray("layers", shaderSource); } // Add shader source generated for blending this layer foreach (var shaderSource in parent.ShadingModels.Generate(this)) { shaderBlendingSource.AddCompositionToArray("layers", shaderSource); } parent.ShadingModels.Clear(); parentPixelLayerContext.ShaderSources.Add(shaderBlendingSource); pendingPixelLayerContext.Reset(); parent.BlendMapForShadingModel = null; }
private void BlendStreams(MaterialBlendLayerContext layer) { // Generate Vertex and Pixel surface shaders foreach (MaterialShaderStage stage in Enum.GetValues(typeof(MaterialShaderStage))) { // If we don't have any stream set, we have nothing to blend var stageContext = layer.GetContextPerStage(stage); if (stageContext.Streams.Count == 0) { continue; } // Blend setup for this layer layer.SetStreamBlend(stage, layer.BlendMap); // Generate a dynamic shader name // Create a mixin var shaderMixinSource = new ShaderMixinSource(); shaderMixinSource.Mixins.Add(new ShaderClassSource("MaterialSurfaceStreamsBlend")); // Add all streams that we need to blend foreach (var stream in stageContext.Streams) { shaderMixinSource.AddCompositionToArray("blends", GetStreamBlendShaderSource(stream)); } stageContext.Streams.Clear(); // Squash all ShaderSources to a single shader source var materialBlendLayerMixin = stageContext.ComputeShaderSource(); stageContext.ShaderSources.Clear(); // Add the shader to the mixin shaderMixinSource.AddComposition("layer", materialBlendLayerMixin); // Squash the shader sources stageContext.ShaderSources.Add(shaderMixinSource); } }