那為什麼一般像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。
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。
Shader render state annotation
directX fx shader一般有提供一些render state,可以直接在每個pass內決定說要做什麼樣的render方式,像是AlphaBlendEnable = false; ZEnable = false;這類的config。
那要注意的是像gamebryo,它則是要在technique這邊宣告一些東西
那要注意的是像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; } }
訂閱:
文章 (Atom)