XNA 2D着色器和SpriteSortMode

3
所以我一直在尝试理解XNA中2D着色器的概念。这个链接(http://msdn.microsoft.com/en-us/library/bb313868(v=xnagamestudio.31).aspx)指出我需要使用SpriteSortMode.Immediate,但是这对我来说是一个问题,因为我已经开发了一个依赖于延迟渲染(SpriteSortMode.BackToFront)的视差系统。
有没有人能够解释一下SpriteSortMode在着色器中的重要性,如果Immediate是必须的,那么我是否可以做些什么来维持我的当前系统,或者其他任何帮助我更好地理解这个问题的内容?
此外,我的游戏运行多个SpriteBatch.Begin()/End()调用(用于绘制背景、游戏、前景和HUD等)。我注意到Bloom示例在这种情况下无法工作,我猜这与它有关。
总的来说,我一直在尝试理解这些概念。我知道什么是着色器以及它的工作原理,但我不知道它如何与XNA交互以及其中的过程。我真的很感激您的帮助。:)
谢谢!

这个问题的答案可能会有所帮助:http://gamedev.stackexchange.com/questions/21220/how-exactly-does-xnas-spritebatch-work - Nic Foster
我认为,如果你想让着色器应用于屏幕上,则不需要使用即时渲染,但如果你想将其作为每个精灵的效果,则需要使用即时渲染。 - Steffan Donal
2个回答

1

如果您尝试进行一些非平凡的操作,例如渲染分层透明度或利用深度缓冲区,则排序模式将很重要。我假设您想要执行一些非平凡的操作,因为您想使用像素着色器来完成它。

SpriteSortMode.Immediate 将按照绘制调用的顺序绘制物体。如果您使用另一种模式,SpriteBatch 将根据纹理将绘制调用分组到视频卡中。这是出于性能原因。

请记住,每次调用 SpriteBatch.Begin 时,都会应用新的像素着色器并丢弃先前设置的像素着色器。(即使新的像素着色器只是 SpriteBatch 的标准像素着色器,它也会应用一个 Tint 颜色。)此外,请记住,通过调用 SpriteBatch.End,您告诉视频卡执行所有当前的 SpriteBatch 命令。

这意味着,如果您的花哨像素着色器的范围有限,那么您可能可以保留现有的排序方法。换句话说,使用一个 Effect 绘制背景,然后使用另一个 Effect 绘制前景和角色。每个 SpriteBatch 的 Begin/End 调用可以单独处理。

如果您的目标是将一个效果(例如热浪或绽放)应用于屏幕上的所有内容,则有另一种选择。您可以选择将所有图形渲染到您创建的RenderTarget而不是直接渲染到视频卡的后台缓冲区。如果您这样做,在渲染部分结束时,您可以调用GraphicsDevice.SetRenderTarget(null)并使用适用于整个场景的自定义着色器将完成的图像绘制到后台缓冲区。


0

我不确定精灵排序模式对着色器的影响有多大,我认为这取决于您使用着色器的目的。

至于bloom效果,如果您正在使用多个begin和end(如果可能的话,您真的希望将其最小化),您可以创建一个与屏幕大小相同的渲染目标,像现在一样绘制所有内容。然后,在最后,将该渲染目标返回(使用graphicsdevice.SetRenderTarget(null);),然后使用bloom着色器绘制全屏渲染目标(在0,0位置),这样您就可以使整个场景发生bloom效果,而不管场景组件使用的各种排序模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接