/// <summary> /// The constructor to create a shader effect. /// </summary> /// <param name="effectPasses">The ordered array of <see cref="EffectPassDeclaration"/> items. The first item /// in the array is the first pass applied to rendered geometry, and so on.</param> /// <param name="effectParameters">A list of (uniform) parameters possibly occurring in one of the shaders in the various passes. /// Each array entry consists of the parameter's name and its initial value. The concrete type of the object also indicates the /// parameter's type. /// </param> /// <remarks>Make sure to list any parameter in any of the different passes' shaders you want to change later on in the effectParameters /// list. Shaders must not contain parameters with names listed in the effectParameters but declared with different types than those of /// the respective default values given here.</remarks> public ShaderEffect(EffectPassDeclaration[] effectPasses, IEnumerable <EffectParameterDeclaration> effectParameters) { if (effectPasses == null || effectPasses.Length == 0) { throw new ArgumentNullException(nameof(effectPasses), "must not be null and must contain at least one pass"); } var nPasses = effectPasses.Length; States = new RenderStateSet[nPasses]; VertexShaderSrc = new string[nPasses]; PixelShaderSrc = new string[nPasses]; GeometryShaderSrc = new string[nPasses]; ParamDecl = new Dictionary <string, object>(); for (int i = 0; i < effectPasses.Length; i++) { States[i] = effectPasses[i].StateSet; VertexShaderSrc[i] = effectPasses[i].VS; PixelShaderSrc[i] = effectPasses[i].PS; GeometryShaderSrc[i] = effectPasses[i].GS; } if (effectParameters != null) { foreach (var param in effectParameters) { ParamDecl.Add(param.Name, param.Value); } } EffectEventArgs = new ShaderEffectEventArgs(this, ShaderEffectChangedEnum.Unchanged); }
/// <summary> /// Creates a new instance of type ShaderEffectProtoPixel. /// </summary> /// <param name="effectPasses"></param> /// <param name="effectParameters"></param> public ShaderEffectProtoPixel(EffectPassDeclarationProto[] effectPasses, IEnumerable <EffectParameterDeclaration> effectParameters) { if (effectPasses == null || effectPasses.Length == 0) { throw new ArgumentNullException(nameof(effectPasses), "must not be null and must contain at least one pass"); } var nPasses = effectPasses.Length; States = new RenderStateSet[nPasses]; VertexShaderSrc = new string[nPasses]; PixelShaderSrc = new string[nPasses]; GeometryShaderSrc = new string[nPasses]; ParamDecl = new Dictionary <string, object>(); if (effectParameters != null) { foreach (var param in effectParameters) { ParamDecl.Add(param.Name, param.Value); } } _effectPasses = effectPasses; for (int i = 0; i < nPasses; i++) { States[i] = effectPasses[i].StateSet; VertexShaderSrc[i] = effectPasses[i].VS; GeometryShaderSrc[i] = effectPasses[i].GS; //PixelShaderSrc is not set here because it gets built in a pre-pass, depending on whether we render deferred or forward. } EffectEventArgs = new ShaderEffectEventArgs(this, ShaderEffectChangedEnum.Unchanged); }