2012-01-19 60 views
2

所以我一直試圖圍繞着XNA 2D中的着色器。XNA 2D着色器和SpriteSortMode

http://msdn.microsoft.com/en-us/library/bb313868(v=xnagamestudio.31).aspx

這個環節上面說,我需要使用SpriteSortMode.Immediate,這是我的問題,因爲我已經開發了依靠延遲渲染(SpriteSortMode.BackToFront)視差系統。

有人可以向我解釋SpriteSortMode在着色器中的重要性,如果立即是強制性的,我可以做的任何事情來維護我當前的系統,以及其他一般情況,以幫助我更好地理解這一點?此外,我的遊戲運行多個SpriteBatch.Begin()/ End()調用(用於繪製背景,然後是遊戲,然後是前景和HUD等)。我注意到布魯姆的例子在這種情況下不起作用,我猜它與此有關。

一般來說,我在理解這些概念時遇到了一些麻煩。我知道着色器是什麼以及它是如何工作的,但我不知道它如何與XNA進行交互以及在那裏發生了什麼。我真的很感激一些啓發。 :)

謝謝!

+0

這個問題的答案可能有一些幫助:http://gamedev.stackexchange.com/questions/21220/how-exactly-does-xnas-spritebatch-work –

+0

我相信,如果你想着色器應用到屏幕上,那麼你不需要使用立即渲染,但是如果你想要它作爲每個精靈效果的話。 –

回答

1

如果您嘗試執行一些不平凡的事情(如呈現分層透明度或使用深度緩衝區),排序模式將很重要。我假設你想做一些不平凡的事情,因爲你想使用像素着色器來完成它。

SpriteSortMode.Immediate將按照繪製調用的順序繪製東西。如果使用其他模式,則SpriteBatch會根據紋理將繪製調用分組到視頻卡(如果可能)。這是出於性能原因。

請記住,每次調用SpriteBatch.Begin時,都會應用一個新的像素着色器並丟棄之前設置的像素着色器。 (即使新的只是SpriteBatch的標準像素着色器,其顏色應用Tint)。另外,請記住,通過調用SpriteBatch.End,您要告訴視頻卡執行所有當前的SpriteBatch命令。

這意味着如果您的幻想像素着色器的範圍有限,則可以保留現有的排序方法。換句話說,用一個Effect繪製背景,然後用另一個繪製前景和字符。每個開始/結束調用SpriteBatch可以分開處理。

如果您的目標是將一個Effect(如熱浪或水花)應用於屏幕上的所有內容,您還有其他選擇。您可以選擇將所有圖形渲染到您創建的RenderTarget而不是直接映射到視頻卡的後臺緩衝區。如果你這樣做,在渲染部分結束時,你可以調用GraphicsDevice.SetRenderTarget(null)並使用適用於整個場景的自定義着色器將完成的圖像繪製到後臺緩衝區。

0

我並不是百分之百地確定精靈排序模式會影響着色器的數量,我認爲這取決於您使用着色器的內容。

至於開花,如果你使用多個開始和結束(你真的想盡量減少,如果你可以)。您可以創建一個呈現屏幕大小的渲染目標,按照現在的方式繪製所有內容。然後在最後,將渲染目標放回(使用graphicsdevice.SetRenderTarget(null);),然後用bloom着色器繪製全屏渲染目標(位於0,0位置),這樣您將綻放整個場景,無論使用各種分類模式的場景組成部分。