儲存供著色器共用的變數與類型
類別連結物件是多個著色器可以共用之變數和類型的命名空間。 當您在呼叫中傳遞類別連結物件來建立著色器時,運行時間會收集變數和類型清單,這些變數和類型可以在著色器中實作每個介面,並將這些變數和類型的名稱儲存在類別鏈接物件中。
因此,當您呼叫 ID3D11ClassLinkage::GetClassInstance 方法,以從類別鏈接物件產生類別實例時,運行時間可以擷取對應至每個著色器中提供之名稱的變數或類型(如果該名稱對指定的著色器有效),並使用指定的類別連結物件建立。
例如,假設您有一個 Light 類別,可實作 Color 介面,並在頂點著色器和像素著色器中使用這個類別。 當您建立著色器時(例如,藉由呼叫 ID3D11Device::CreatePixelShader),運行時間會判斷頂點和像素著色器中都有可用的 Light 類別類型,並將 Light 類別類型新增至類別鏈接物件。 然後,您可以在想要的位置建立 Light 實例,系結兩個著色器的資源,並在將著色器設定到裝置時,將此實例傳遞至類別實例陣列中(例如,呼叫 ID3D11DeviceContext::PSSetShader)。 執行環境接著會執行下列程序:
- 確認實例是使用相同的類別連結物件建立的。
- 確認頂點和像素著色器中都有可用的 Light 類別類型。
- 選取正確的函數表,而頂點著色器和像素著色器的函數表可能不同。
- 將 實例提供的位移向下傳送。
類別連結物件最終是類型和變數名稱的存放庫。 每個專案可用的名稱數目上限(類型和變數)為 64K。 類型和變數名稱越長,每個著色器所儲存的介面元數據的儲存需求就越高。 這是因為運行時間必須為每個著色器儲存這些名稱的對應。
相關主題
相關主題