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。

沒有留言:

張貼留言