2011-02-25 67 views
1

我目前有兩個着色器,一個處理着色器(頂點和像素) - 計算光照和投影變換。然後將其渲染爲紋理。然後我有我的第二個着色器,一個後處理着色器,它讀取渲染的紋理並將其輸出到屏幕(同樣是頂點着色器和像素着色器)。交換Direct3D 11着色器時管理狀態的好方法是什麼?

一旦我將場景渲染爲紋理,我將立即上下文的頂點和像素着色器與後處理交換,但我不知道如何管理狀態(例如我的紋理參數和常量緩衝區) 。交換着色器,然後每幀兩次手動重置常量緩衝區和紋理看起來非常浪費,並且首先會破壞常量緩衝區的位置,但據我所知,您無法在着色器對象上設置數據,它必須傳遞給上下文。

其他人建議在交換着色器時使用相當簡單高效的方式管理變量和紋理。

回答

3

由於您沒有得到D3D11專家的解答,所以我提供了我有限的D3D9體驗,以瞭解它的價值。

...兩次,每次框架似乎令人難以置信的浪費......

「似乎」 是一個可疑的詞有。你衡量了性能打擊嗎?每幀兩次聽起來不錯。

對於紋理,我根據目的分配我的紋理寄存器。我將寄存器< s4用於材質特定的紋理,> = s4用於渲染目標紋理,這些紋理在遊戲開始時只分配一次。因此,例如,我的主場景着色器有以下幾點:

sampler2D DiffuseMap : register(s0); 
sampler2D DetailMap : register(s1); 

sampler2D DepthMap : register(s4); 
sampler2D ShadowMap : register(s5); 
sampler2D LightMap : register(s6); 
sampler2D PrevFrame : register(s7); 

所以我的粒子着色器有一組減少,但質地深度圖仍處於同一插槽...

sampler2D Tex : register(s0); 
sampler2D DepthMap : register(s4); 

我不不知道這適用於D3D11有多少,但我希望它有一些用處。

+0

噢,我看到了,我做了一個錯誤的假設,即每次交換着色器時都必須重新傳遞數據,而如果將它們存儲在不同的寄存器中,則只要需要,它們就會保留在那裏。非常感謝 – 2011-03-14 16:43:31