当前位置: 首页 > 编程语言 > C#

XNA屏幕截图显示在Bloom之前,而不是最终RenderShare

时间:2023-04-11 10:58:08 C#

我的项目基于GameStateManagement示例,但后来我添加了Bloom和spriteSheet/spriteBatch功能。我想保存最终屏幕输出的屏幕截图。但是,当我保存我的屏幕截图时,它只显示应用光晕之前和显示我的HUD文本之前的渲染(我在光晕之后绘制)。在这两个过程之后,屏幕截图保存在我的Draw方法的末尾。我尝试过各种各样的事情。安德鲁在这里的回答有助于在XNA中截取屏幕截图并保存图像;但是,它不会保存最终渲染。我有一种感觉,它与绽放过程或spgrabatch有关。这是我的代码:示例{publicoverridevoidDraw(GameTimegameTime){//清屏黑屏ScreenManager.GraphicsDevice.Clear(ClearOptions.Target,Color.Black,0,0);SpriteBatchspriteBatch=ScreenManager.SpriteBatch;spriteBatch.Begin(SpriteSortMode.Deferred,BlendState.AlphaBlend);//然后我绘制我所有的游戏内容spriteBatch.End();#region后处理和BloomScreenManager.GraphicsDevice.SamplerStates[1]=SamplerState.LinearClamp;//第1遍:使用仅提取图像最亮部分的//着色器将场景绘制到渲染目标1中。bloomExtractEffect.Parameters["BloomThreshold"].SetValue(Settings.BloomThreshold);DrawFullscreenQuad(sceneRenderTarget,renderTarget1,bloomExtractEffect,IntermediateBuffer.PreBloom);//传递2:从rendertarget1绘制到rendertarget2,//使用着色器应用水平高斯模糊滤镜。设置模糊效果参数米(1.0f/(浮动)renderTarget1.Width,0);DrawFullscreenQuad(renderTarget1,renderTarget2,gaussianBlurEffect,IntermediateBuffer.BlurredHorizo??ntally);//传递3:从渲染目标2绘制回渲染目标1,//使用着色器应用垂直高斯模糊滤镜。SetBlurEffectParameters(0,1.0f/(float)renderTarget1.Height);DrawFullscreenQuad(renderTarget2,renderTarget1,gaussianBlurEffect,IntermediateBuffer.BlurredBothWays);//第4步:将rendertarget1和原始场景//图像绘制回主后台缓冲区,使用着色器将它们组合//以产生最终的绽放结果。ScreenManager.GraphicsDevice.SetRenderTarget(null);EffectParameterCollectionparameters=bloomCombineEffect.Parameters;参数["BloomIntensity"].SetValue(Settings.BloomIntensity);参数["BaseIntensity"].SetValue(Settings.BaseIntensity);参数["BloomSaturation"].SetValue(Settings.BloomSaturation);参数[“基础饱和度n"].SetValue(Settings.BaseSaturation);ScreenManager.GraphicsDevice.Textures[1]=sceneRenderTarget;Viewportviewport=ScreenManager.GraphicsDevice.Viewport;DrawFullscreenQuad(renderTarget1,viewport.Width,viewport.Height,bloomCombineEffect,IntermediateBuffer.FinalResult);#endregionspriteBatch.Begin();//绘制HUDspriteBatch.End();if(screenShotTake){using(FileStreamfs=File.Open(@"screenshot"+(screenshotNumber)+@".png",FileMode.OpenOrCreate)){//在这里我尝试保存屏幕截图Texture2DsceneRenderTarget.SaveAsPng(fs,(int)viewportSize.X,(int)viewportSize.Y);//将渲染目标保存到磁盘}}}#regionPostProcess&BloomvoidDrawFullscreenQuad(Texture2Dtexture,RenderTarget2DrenderTarget,Effecteffect,IntermediateBuffercurrentBuffer){ScreenManager.GraphicsDevice.SetRenderTarget(renderTarget);DrawFullscreenQuad(texture,renderTarget.Width,renderTarget.Height,effect,currentBuffer);}voidDrawFullscreenQuad(Texture2Dtexture,intwidth,intheight,Effecteffect,IntermediateBuffercurrentBuffer){if(showBuffer