public override IObservable <IplImage> Process(IObservable <IplImage> source) { return(Observable.Create <IplImage>(observer => { var name = TextureName; var texture = default(Texture); var textureSize = default(Size); if (string.IsNullOrEmpty(name)) { throw new InvalidOperationException("A texture name must be specified."); } return source.CombineEither( ShaderManager.WindowSource.Do(window => { window.Update(() => { try { texture = window.ResourceManager.Load <Texture>(name); } catch (Exception ex) { observer.OnError(ex); } }); }), (input, window) => { window.Update(() => { var target = TextureTarget; if (target > TextureTarget.TextureBindingCubeMap && target < TextureTarget.ProxyTextureCubeMap) { GL.BindTexture(TextureTarget.TextureCubeMap, texture.Id); } else { GL.BindTexture(target, texture.Id); } var internalFormat = textureSize != input.Size ? InternalFormat : (PixelInternalFormat?)null; TextureHelper.UpdateTexture(target, internalFormat, input); textureSize = input.Size; }); return input; }).SubscribeSafe(observer); })); }