2012年5月8日 星期二

Gambryo standard material registry global constant

因為繼承gamebryo previewer的standard material來修改gamebryo的shader pipeline,一般我們新增一個global attribute這個動作一般都放在standard material的callback function,像是HandleFinalPixelOutputs function。但是要注意因為這個callback function是在model被render時,如果shader仍然沒有被產生出來,才會呼叫到這一個callback function。所以自然的在gamebryo shader factory global attributes list,都還不知道有一個新增的變數。如果剛好我們在這之前,先用了NiShaderFactory::UpdateGlobalShaderConstant,這樣自然在 global attributes list內,找不到指定變數名來update。如果一定要在callback function被呼叫之前就要有這個  global attribute,應該用 NiShaderFactory::RegisterGlobalShaderConstant。

那為什麼一般像fx的shader就不用這樣,是因為fx本身在code內就寫好有哪些attributes是global了,所以gamebryo去load指定的shader library時就會去找到哪些attributes是global的,把它加到global attributes list。而相反的因為繼承standard material的關係,因為是shade tree的關係,所以shader code是動態產生的,必須等到callback function執行才知道有新的global attributes。

Shader render state annotation

directX fx shader一般有提供一些render state,可以直接在每個pass內決定說要做什麼樣的render方式,像是AlphaBlendEnable = false; ZEnable = false;這類的config。

那要注意的是像gamebryo,它則是要在technique這邊宣告一些東西

technique testTechnique
<
    string Description = "Gamebryo annotation";//這行只是描述而已
    string ShaderName = "testTechnique";//gamebryo這行要match technique的名字
    bool UsesNiRenderState = true;//要設為true, gamebryo才會設定render state
>
{
    pass P0
    {
        .....
        ZEnable = false;
        AlphaBlendEnable = false;
    }
}