public static byte[] ToPng(DeviceContextHolder holder, byte[] bytes, bool ignoreAlpha, out Format format) { Viewport[] viewports = null; try { using (var stream = new System.IO.MemoryStream()) using (var effect = new EffectPpBasic()) using (var output = TargetResourceTexture.Create(Format.R8G8B8A8_UNorm)) using (var resource = ShaderResourceView.FromMemory(holder.Device, bytes)) { var texture = (Texture2D)resource.Resource; var loaded = texture.Description; effect.Initialize(holder.Device); format = loaded.Format; output.Resize(holder, loaded.Width, loaded.Height); holder.DeviceContext.ClearRenderTargetView(output.TargetView, Color.Transparent); holder.DeviceContext.OutputMerger.SetTargets(output.TargetView); viewports = holder.DeviceContext.Rasterizer.GetViewports(); holder.DeviceContext.Rasterizer.SetViewports(new Viewport(0, 0, loaded.Width, loaded.Height, 0.0f, 1.0f)); holder.DeviceContext.OutputMerger.BlendState = null; holder.QuadBuffers.Prepare(holder.DeviceContext, effect.LayoutPT); effect.FxInputMap.SetResource(resource); holder.PrepareQuad(effect.LayoutPT); if (ignoreAlpha) { effect.TechCopyNoAlpha.DrawAllPasses(holder.DeviceContext, 6); } else { effect.TechCopy.DrawAllPasses(holder.DeviceContext, 6); } Texture2D.ToStream(holder.DeviceContext, output.Texture, ImageFileFormat.Png, stream); stream.Position = 0; return stream.GetBuffer(); } } finally { if (viewports != null) { holder.DeviceContext.Rasterizer.SetViewports(viewports); } } }
protected override void InitializeInner() { _deferredLighting = DeviceContextHolder.GetEffect<EffectDeferredLight>(); _deferredResult = DeviceContextHolder.GetEffect<EffectDeferredResult>(); _ppBasic = DeviceContextHolder.GetEffect<EffectPpBasic>(); _gDepthBuffer = TargetResourceDepthTexture.Create(); _gBufferBase = TargetResourceTexture.Create(Format.R16G16B16A16_Float); _gBufferNormal = TargetResourceTexture.Create(Format.R32G32B32A32_Float); _gBufferMaps = TargetResourceTexture.Create(Format.R8G8B8A8_UNorm); _temporaryDepthBuffer = TargetResourceDepthTexture.Create(); _temporaryBuffer0 = TargetResourceTexture.Create(Format.R16G16B16A16_Float); _temporaryBuffer1 = TargetResourceTexture.Create(Format.R16G16B16A16_Float); _temporaryBuffer2 = TargetResourceTexture.Create(Format.R16G16B16A16_Float); _temporaryBuffer3 = TargetResourceTexture.Create(Format.R16G16B16A16_Float); _outputBuffer = TargetResourceTexture.Create(Format.R8G8B8A8_UNorm); _reflectionCubemap = new ReflectionCubemap(1024); _reflectionCubemap.Initialize(DeviceContextHolder); _sunShadows = new ShadowsDirectional(2048); _sunShadows.Initialize(DeviceContextHolder); }
public void OnInitialize(DeviceContextHolder holder) { _effect = holder.GetEffect<EffectPpBasic>(); }