2012-08-14 105 views
1

我們預渲染大套的質地來RenderTexture2D,這是我們所遇到的問題:XNA清除紋理中間渲染?

Render issues with XNA

似乎隨機在呈現一個塊中,紋理的每個單元格(頂部和側面)會腐敗並消失。奇怪的是,當下一個塊被渲染時它們會回來,所以它似乎是以每幀爲基礎發生的事情。

有沒有人知道爲什麼會發生這種情況(並隨機看起來;請注意,白色的矩形是一個側面紋理腐敗的地方,你可以從那裏看到紋理包含透明)?

編輯:立方體的邊正被保存到Texture2D,但它們仍然在一個塊渲染中消失,然後回到下一個。所以我不明白爲什麼Texture2D中的圖形正在消失並回來,沒有重新初始化(這就是奇怪的部分)。

+0

建議將這個問題添加到http://gamedev.stackexchange.com/來代替,那就是很多gamedev玩家隱藏的地方。 – 2012-08-14 06:55:02

回答

0

我不能說,我們曾解決過這個問題是肯定的,但它似乎有什麼事情而導致的任何線程或分裂跨越多個週期的任務。 RenderTarget2D不是問題,因爲我們當時已經這麼做了。

1

RenderTexture2D只是一個臨時的內存構造,並且會相當快速和經常刷新。這是因爲它被重複使用以努力節省內存,並在較小程度上加快速度。因此,您應該只將它視爲臨時存放紋理的地方。你會想把它移到一個合適的Texture2D中,這個Texture2D會被存儲更長的時間。只是做一個簡單的:

Texture2D YourPic = (RenderTexture2D)SomeRenderedPic; 

不會這樣做。這只是將指針傳遞給渲染圖像的內存空間。當顯卡丟棄時,它仍然會消失。你想要做的是更多的東西一樣:

Color[] MyColorArray = new Color[SomeRenderedPic.Width * SomeRenderedPic.Height]; 
SomeRendeerPic.GetData<Color>(MyColorArray); 
Texture2D YourPic = new Texture2D(
     GraphicsDevice, 
     SomeRenderedPic.Width, 
     SomeRenderedPic.Height); 
YourPic.SetData<Color>(MyColorArray); 

現在,如果我都颳起了該代碼的權利,那麼它應該指針存儲數據,而不是進入新的紋理。這使得新紋理有自己獨特的內存空間,不會像渲染目標空間那樣被刷新。

這種方法存在缺陷。它不能以XNA的全新刷新率完成。 (每秒60幀......我認爲......也許30 ...我忘記了。)無論如何,如果你需要持續不斷的刷新,這可能不夠快。然而,如果你正在創建一個靜態紋理,如果它從來沒有真正改變過,那麼這可能會對你有用。

希望這是有道理的,因爲我在飛行和深夜寫這個。如果這不起作用,我表示歉意。如有需要,請隨時寫信給[email protected]。如果我能夠回答你的問題,我會很樂意。

否則祝你好運,並有創造力。我相信有一個解決方案。

X傑里米M.

+0

在發佈代碼時,突出顯示它並點擊代碼按鈕{ - },它會將其設置爲語法高亮顯示,這會使答案更具可讀性(它也不會摺疊代碼塊中的換行符) – 2012-08-14 07:33:02

+0

+1。不過,我很確定「定期和快速」並不完全準確。如果GraphicsDevice被某種方式重置(你可以用RenderTarget2D.IsContentLost或ContentLost檢測到),它們應該只會消失。如果使用'SetRenderTarget'將它們的'RenderTargetUsage'設置爲'DiscardContents'(默認或Xbox上的PlatformContents),它們就會被清除。我從來沒有聽說過他們因其他原因離開了嗎? – 2012-08-14 08:27:44

+0

有趣的是,我們實際上是將RenderTarget2D渲染成等角兩側,然後像你說的那樣轉換爲Texture2D。有趣的是,立方體的邊消失了大塊的中間渲染,然後在渲染下一個時渲染,即使我們只在遊戲開始時初始化等距立方體紋理。 – 2012-08-14 11:28:16