예제 #1
0
        /// <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();
            }
        }
예제 #2
0
        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);
                }
            }    
        }