我有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個?
我猜想,設置渲染目標和輸入紋理很多次,我不再需要這樣做。這會避免它,它會值得嗎?
請注意,我可以在着色器內單獨優化代碼,如果需要,我會問一個單獨的問題。
感謝您的答案,那裏有幾個有趣的鏈接。當然,我做事情的方式目前看起來相當標準,每次迭代都會切換渲染目標/輸入紋理。然而,我試圖得到的是,我可以在迭代之前將6個不同的寄存器(0,.... 5)中的所有6個紋理放在一起,然後每個迭代都有一個着色器在寫入時從0,1和2讀取到3,4和5.然後有第二個接近相同的着色器,寫入0,1和2時從3,4,5讀取。這是可能的嗎?它會是值得的(因爲我不會移動紋理做不同的寄存器/採樣器嗎? – 2011-04-01 08:38:19
@George:不,這是我的觀點,你*不能*設置紋理作爲採樣器和同時作爲渲染目標。你必須取消它們以便交換它們。**一些經驗法則:**複製紋理非常昂貴 - 並且如我所描述的那樣在XNA中避免使用棘手的問題。[開始新的批處理是昂貴的(在CPU上)](http://gamedev.stackexchange.com/questions/8521/x/8533#8533)。更改紋理和渲染目標*價格低廉 - 除了需要一個新的批次並可能導致渲染目標的管道刷新 - 但這些成本是您即使想法奏效也不得不承擔的成本。 – 2011-04-01 13:38:48
啊,好吧,我想我現在明白了。感謝您解決問題並獲取更多信息。 – 2011-04-01 14:53:28