2011-03-31 63 views
2

我有3種不同的xna效果,一種叫initialise,一種叫迭代,一種叫finalize。瞭解紋理寄存器和採樣器,並考慮到了優化

初始化不需要紋理輸入,並呈現爲3個目標。 迭代將這3個作爲紋理輸入,並渲染到3個目標,迭代運行多次。 Finalize需要1個紋理輸入並呈現給一個目標。

我有幾個輔助類,但什麼是從我的渲染循環回事低於它應該是顯而易見的:

int i = 0; 

FractalInitRenderer.DefineOutputs(IterationsAndControl[i], Variables1And2[i], Variables3And4[i]); 
FractalInitRenderer.Draw(); 

for (; i < 50; i++) 
{ 
    FractalIterateRenderer.ClearInputTextures(); 
    FractalIterateRenderer.AddInput("IterationsAndControl", IterationsAndControl[i % 2]); 
    FractalIterateRenderer.AddInput("Variables1And2", Variables1And2[i % 2]); 
    FractalIterateRenderer.AddInput("Variables3And4", Variables3And4[i % 2]); 
    FractalIterateRenderer.DefineOutputs(IterationsAndControl[(i + 1) % 2], Variables1And2[(i + 1) % 2], Variables3And4[(i + 1) % 2]); 
    FractalIterateRenderer.Draw(); 
} 

FractalFinaliseRenderer.ClearInputTextures(); 
FractalFinaliseRenderer.AddInput("IterationsAndControl", IterationsAndControl[i % 2]); 
FractalFinaliseRenderer.Draw(); 

我的質地聲明使用下面的宏,並沿着定義如下,我的輸出結構:

#define DECLARE_TEXTURE(Name, index) \ 
    Texture2D<float4> Name : register(t##index); \ 
    sampler Name##Sampler : register(s##index); 
struct FRACTAL_OUTPUT 
{ 
    float4 IterationsAndControl : COLOR0; 
    float4 Variables1And2 : COLOR1; 
    float4 Variables3And4 : COLOR2; 
}; 

什麼,我不知道是的,我可以把輸入和輸出呈現不同的紋理寄存器目標,那麼也許跑2個迭代像素着色器交替他們閱讀的F一個rom前3個寄存器,寫入最後3個,其他讀取最後3個,寫入前3個?

我猜想,設置渲染目標和輸入紋理很多次,我不再需要這樣做。這會避免它,它會值得嗎?

請注意,我可以在着色器內單獨優化代碼,如果需要,我會問一個單獨的問題。

回答

0

作爲documentation狀態:

在繪圖時,紋理不能同時設置爲渲染目標和的階段的組織。

基本上,你在做什麼的概念是好的。有三個輸入紋理和三個輸出紋理,然後在每次通過時切換它們。但是你必須明確地切換它們。

不過,好消息是,我很確定,在Windows上,,更改紋理和渲染目標是一個相對便宜的操作。您可能想要混淆RenderTargetUsage(可能設置爲PreserveContents)以僅創建單個曲面。 (我並不完全確定XNA 4.0是做什麼的,因爲在早期版本中它的行爲只有documented,並且它的may have changed;您可以嘗試使用PIX來查找)。

Xbox 360,另一方面,是a different story

+0

感謝您的答案,那裏有幾個有趣的鏈接。當然,我做事情的方式目前看起來相當標準,每次迭代都會切換渲染目標/輸入紋理。然而,我試圖得到的是,我可以在迭代之前將6個不同的寄存器(0,.... 5)中的所有6個紋理放在一起,然後每個迭代都有一個着色器在寫入時從0,1和2讀取到3,4和5.然後有第二個接近相同的着色器,寫入0,1和2時從3,4,5讀取。這是可能的嗎?它會是值得的(因爲我不會移動紋理做不同的寄存器/採樣器嗎? – 2011-04-01 08:38:19

+0

@George:不,這是我的觀點,你*不能*設置紋理作爲採樣器和同時作爲渲染目標。你必須取消它們以便交換它們。**一些經驗法則:**複製紋理非常昂貴 - 並且如我所描述的那樣在XNA中避免使用棘手的問題。[開始新的批處理是昂貴的(在CPU上)](http://gamedev.stackexchange.com/questions/8521/x/8533#8533)。更改紋理和渲染目標*價格低廉 - 除了需要一個新的批次並可能導致渲染目標的管道刷新 - 但這些成本是您即使想法奏效也不得不承擔的成本。 – 2011-04-01 13:38:48

+0

啊,好吧,我想我現在明白了。感謝您解決問題並獲取更多信息。 – 2011-04-01 14:53:28