gpt4 book ai didi

c# - XNA 截图显示了 pre-Bloom,而不是最终渲染

转载 作者:行者123 更新时间:2023-11-30 15:01:39 26 4
gpt4 key购买 nike

我有一个使用 Reach 图形设置在 C# XNA 4.0 中编码的 Windows 平台游戏。我的项目基于 GameStateManagement 示例,但后来我向其中添加了 Bloom 和 spriteSheet/spriteBatch 功能。

我希望保存最终屏幕输出的屏幕截图。但是,当我保存我的屏幕截图时,它只显示应用 Bloom 之前和显示我的 HUD 文本之前的渲染(我在 Bloom 之后绘制)。在这两个过程之后,我在 Draw 方法的末尾保存了我的屏幕截图。

我试过各种各样的东西。安德鲁在这里的回答 Take screen shot in XNA很有帮助,确实保存了图像;但是,它并没有保存最终渲染。

我感觉它与 bloom 过程或 spritebatch 有关。

这是我的代码:

    example {
public override void Draw(GameTime gameTime)
{
ScreenManager.GraphicsDevice.SetRenderTarget(sceneRenderTarget);
// Clear the screen to black
ScreenManager.GraphicsDevice.Clear(ClearOptions.Target,
Color.Black, 0, 0);
SpriteBatch spriteBatch = ScreenManager.SpriteBatch;
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend);

// then i draw all my game stuff

spriteBatch.End();

#region Post-Processing & Bloom
ScreenManager.GraphicsDevice.SamplerStates[1] = SamplerState.LinearClamp;

// Pass 1: draw the scene into rendertarget 1, using a
// shader that extracts only the brightest parts of the image.
bloomExtractEffect.Parameters["BloomThreshold"].SetValue(
Settings.BloomThreshold);

DrawFullscreenQuad(sceneRenderTarget, renderTarget1,
bloomExtractEffect,
IntermediateBuffer.PreBloom);

// Pass 2: draw from rendertarget 1 into rendertarget 2,
// using a shader to apply a horizontal gaussian blur filter.
SetBlurEffectParameters(1.0f / (float)renderTarget1.Width, 0);

DrawFullscreenQuad(renderTarget1, renderTarget2,
gaussianBlurEffect,
IntermediateBuffer.BlurredHorizontally);

// Pass 3: draw from rendertarget 2 back into rendertarget 1,
// using a shader to apply a vertical gaussian blur filter.
SetBlurEffectParameters(0, 1.0f / (float)renderTarget1.Height);

DrawFullscreenQuad(renderTarget2, renderTarget1,
gaussianBlurEffect,
IntermediateBuffer.BlurredBothWays);

// Pass 4: draw both rendertarget 1 and the original scene
// image back into the main backbuffer, using a shader that
// combines them to produce the final bloomed result.
ScreenManager.GraphicsDevice.SetRenderTarget(null);

EffectParameterCollection parameters = bloomCombineEffect.Parameters;

parameters["BloomIntensity"].SetValue(Settings.BloomIntensity);
parameters["BaseIntensity"].SetValue(Settings.BaseIntensity);
parameters["BloomSaturation"].SetValue(Settings.BloomSaturation);
parameters["BaseSaturation"].SetValue(Settings.BaseSaturation);

ScreenManager.GraphicsDevice.Textures[1] = sceneRenderTarget;

Viewport viewport = ScreenManager.GraphicsDevice.Viewport;

DrawFullscreenQuad(renderTarget1,
viewport.Width, viewport.Height,
bloomCombineEffect,
IntermediateBuffer.FinalResult);

#endregion

spriteBatch.Begin();
// Draw HUD
spriteBatch.End();


if (screenShotTake)
{
using (FileStream fs = File.Open(@"screenshot" + (screenshotNumber) + @".png", FileMode.OpenOrCreate))
{
// Right here I try to save out the screen shot Texture2D
sceneRenderTarget.SaveAsPng(fs, (int)viewportSize.X, (int)viewportSize.Y); // save render target to disk
}
}
}




#region PostProcess & Bloom
void DrawFullscreenQuad(Texture2D texture, RenderTarget2D renderTarget,
Effect effect, IntermediateBuffer currentBuffer)
{
ScreenManager.GraphicsDevice.SetRenderTarget(renderTarget);

DrawFullscreenQuad(texture,
renderTarget.Width, renderTarget.Height,
effect, currentBuffer);


}

void DrawFullscreenQuad(Texture2D texture, int width, int height,
Effect effect, IntermediateBuffer currentBuffer)
{
if (showBuffer < currentBuffer)
{
effect = null;
}

spriteBatch.Begin(0, BlendState.Opaque, null, null, null, effect);
spriteBatch.Draw(texture, new Rectangle(0, 0, width, height), Color.White);
spriteBatch.End();
}

最佳答案

问题出在这里:

ScreenManager.GraphicsDevice.SetRenderTarget(null);

由于这一行,您将效果绘制到后台缓冲区,但您正在保存的渲染目标保持不变。您会看到效果的结果,因为它是直接绘制的,但您保存的不是您绘制到后台缓冲区的内容。要解决此问题,请将效果绘制到另一个 RenderTarget,然后将其作为单个纹理绘制到后台缓冲区。显然,这是另一个要处理的绘制调用,但它的成本最低。通过这样做,您可以从新的 RenderTarget 中获取纹理并按照您喜欢的方式保存它。

关于c# - XNA 截图显示了 pre-Bloom,而不是最终渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13824359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com