c# - 重置由 SetRenderTarget() 等函数引起的 XNA 属性更改

标签 c# xna xbox360

我是 XNA 的新手,想知道是否有一些内置工作流可以将图形堆栈恢复到给定状态。例如,我注意到在 Sprite 渲染到我的 3D 场景后,3D 部分在调用 SpriteBatch.begin() 后停止工作,我不得不通过

修复它
  GraphicsDevice.BlendState = BlendState.Opaque;
  GraphicsDevice.DepthStencilState = DepthStencilState.Default;
  GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;

是否有像 glPushAttrib()/glPopAttrib() 这样的东西来包装它而不是仅仅知道 Sprite 引擎改变了什么状态?

我当前的问题是我正在玩渲染目标,在创建渲染目标后,我发现我的 3D 部分在调用 SetRenderTarget() 后似乎乱七八糟。

例如,如果我要调用以下两个函数,根据我对文档的理解,将图形设备设置为 null 应该会重置所有内容。

  GraphicsDevice.SetRenderTarget(target);
  GraphicsDevice.SetRenderTarget(null);

注释掉上面的第一行可以保持 3D 渲染的正确性,所以我假设在那个调用中一些状态发生了很大的变化。这些状态更改是否通过调用记录在某处,或者是否有一种方法可以显式保存状态并在完成某些操作后将其恢复?

最佳答案

有一些关于渲染目标的文档,

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.rendertarget%28v=xnagamestudio.20%29.aspx

要将渲染目标重置回后台缓冲区,请使用

GraphicsDevice.SetRenderTarget(0, null);

另外(我的随机想法,不确定)

您可以(也许)将其添加到 spritebatch,

SpriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.Opaque, SamplerState.LinearWrap, DepthStencilState.Default, null);

还没有对渲染目标做过很多工作,但我相信它会做同样的事情。然后下次重置时,只需调用不带参数的 spriteBatch(或任何你想要的 spritebatch)

关于c# - 重置由 SetRenderTarget() 等函数引起的 XNA 属性更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9755549/

相关文章:

c# - .NET 项目引用 : How to reference a dll via a referenced project?

c# - 在 XNA 中获取轻拂手势的起始位置

c# - 我如何使用 XNA 中的着色器为单个像素着色?

visual-studio-2010 - 调试 Xbox 360 游戏?

Java 使用 Xbox Controller

c# - SyncRoot 如何/为什么隐藏在 Queue<T> 上?

c# - 为什么我的 C# 代码没有从我的 Oracle 函数中获得返回值?

c# - 使用 Monotouch 从 Iphone 的 key 链访问客户端证书

c# - 如何以 "natural"方式高效地在 2D 表面上展开对象?