/// <inheritdoc/> public override EffectImplementation Process(ContentManager manager, IContentProcessorMetadata metadata, String input) { var isFragShader = (metadata.Extension == ".frag"); var isVertShader = (metadata.Extension == ".vert"); if (!isFragShader && !isVertShader) { throw new InvalidDataException(OpenGLStrings.ImplicitEffectsMustLoadFromShaders.Format(metadata.AssetPath)); } var vertShaderFilePath = isFragShader ? Path.ChangeExtension(metadata.AssetPath, "vert") : metadata.AssetPath; var fragShaderFilePath = isFragShader ? metadata.AssetPath : Path.ChangeExtension(metadata.AssetPath, "frag"); metadata.AddAssetDependency(isFragShader ? vertShaderFilePath : fragShaderFilePath); var vertShaderSource = ShaderSource.ProcessExterns(manager.Load <ShaderSource>(vertShaderFilePath), Externs); var vertShader = new OpenGLVertexShader(manager.Ultraviolet, new[] { vertShaderSource }); var fragShaderSource = ShaderSource.ProcessExterns(manager.Load <ShaderSource>(fragShaderFilePath), Externs); var fragShader = new OpenGLFragmentShader(manager.Ultraviolet, new[] { fragShaderSource }); var program = new OpenGLShaderProgram(manager.Ultraviolet, vertShader, fragShader, false); var pass = new OpenGLEffectPass(manager.Ultraviolet, "Default", new[] { program }); var technique = new OpenGLEffectTechnique(manager.Ultraviolet, "Default", new[] { pass }); return(new OpenGLEffectImplementation(manager.Ultraviolet, new[] { technique })); }
/// <summary> /// Creates the effect implementation. /// </summary> /// <param name="uv">The Ultraviolet context.</param> /// <returns>The effect implementation.</returns> private static EffectImplementation CreateEffectImplementation(UltravioletContext uv) { Contract.Require(uv, nameof(uv)); var programs = new OpenGLShaderProgram[VSIndices.Length]; for (var i = 0; i < programs.Length; i++) { var vShader = VSArray[VSIndices[i]]; var fShader = PSArray[PSIndices[i]]; programs[i] = new OpenGLShaderProgram(uv, vShader, fShader, false); } var passes = new[] { new OpenGLEffectPass(uv, null, programs) }; var techniques = new[] { new OpenGLEffectTechnique(uv, null, passes) }; return(new OpenGLEffectImplementation(uv, techniques)); }