/// <summary> /// Renders the source from parameter to the current device's render target. /// It just copies one RT into another (but by a rendering pass - so it's probably redundant). /// </summary> /// <param name="source"></param> internal static void Blit(Texture source, bool scaleToTarget, MyEffectScreenshot.ScreenshotTechniqueEnum technique = MyEffectScreenshot.ScreenshotTechniqueEnum.Default) { var screenEffect = m_effects[(int)MyEffects.Screenshot] as MyEffectScreenshot; screenEffect.SetSourceTexture(source); //For case that source is bigger then camera viewport (back camera etc.) Vector2 scale = Vector2.One; if (scaleToTarget) { scale = GetScaleForViewport(source); } screenEffect.SetScale(scale); screenEffect.SetTechnique(technique); BlendState bs = BlendState.Current; if (technique == MyEffectScreenshot.ScreenshotTechniqueEnum.DepthToAlpha) { MyStateObjects.AlphaChannels_BlendState.Apply(); } GetFullscreenQuad().Draw(screenEffect); if (technique == MyEffectScreenshot.ScreenshotTechniqueEnum.DepthToAlpha) { bs.Apply(); } }
internal static void TakeScreenshot(string name, BaseTexture target, MyEffectScreenshot.ScreenshotTechniqueEnum technique) { if (ScreenshotOnlyFinal && name != "FinalScreen" && name != "test") return; // Screenshot object survives only one DRAW after created. We delete it immediatelly. So if 'm_screenshot' // is not null we know we have to take screenshot and set it to null. if (m_screenshot != null) { try { if (target is Texture) { Texture renderTarget = target as Texture; Texture rt = new Texture(MyRender.GraphicsDevice, renderTarget.GetLevelDescription(0).Width, renderTarget.GetLevelDescription(0).Height, 0, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default); MyRender.SetRenderTarget(rt, null); BlendState.NonPremultiplied.Apply(); DepthStencilState.None.Apply(); RasterizerState.CullNone.Apply(); MyEffectScreenshot ssEffect = GetEffect(MyEffects.Screenshot) as MyEffectScreenshot; ssEffect.SetSourceTexture(renderTarget); ssEffect.SetTechnique(technique); ssEffect.SetScale(Vector2.One); MyRender.GetFullscreenQuad().Draw(ssEffect); MyRender.SetRenderTarget(null, null); string filename = m_screenshot.SaveTexture2D(rt, name); rt.Dispose(); MyRenderProxy.ScreenshotTaken(filename != null, filename, m_screenshot.ShowNotification); } else if (target is CubeTexture) { string filename = m_screenshot.GetFilename(name + ".dds"); CubeTexture.ToFile(target, filename, ImageFileFormat.Dds); MyRenderProxy.ScreenshotTaken(true, filename, m_screenshot.ShowNotification); } } catch (Exception e) { Log.WriteLine("Error while taking screenshot."); Log.WriteLine(e.ToString()); MyRenderProxy.ScreenshotTaken(false, null, m_screenshot.ShowNotification); } } }