一般送進shader的color stream,如果要省顯示卡記憶體空間的話,可以考慮使用unsigned integer的方式送進去。通常空間會有三倍的差距。
目前不知道format在DirectX會叫什麼,但是Gamebryo的話,在使用color stream時element format就叫F_NORMUINT8_4,並且在Gamebryo的預設Material class內會有個SetupPackingRequirements這個function,專門用來設定套用這個Material的Mesh有哪些stream可以送到shader內(這樣的好處是不管Mesh有哪些資料,只要套用到自訂的Material就可以決定說我們只要用Mesh的哪些資料,這樣就不用全部送到shader內浪費顯卡記憶體空間),記得在這邊設定Shader declaration的話要使用SPTYPE_UBYTECOLOR。
然後在shader裡面的color register宣告還是可以宣告成float4,shader會自動幫忙正規化到0~1之間。
這邊要注意使用unsigned integer的動作,可能會有數值誤差的問題。如果color資料需要事先在CPU內計算,並且儲存的格式是unsigned integer,而且color資料會在CPU內先用一些浮點數運算,因為要轉成unsigned int而去掉小數點的數值,然後最後送到GPU內,並且在GPU內又要使用color做運算。注意這邊在GPU的時候拿到的數值,就是已經被去掉部分小數,又轉成float的數值了,這樣的值一定會比整個過程都用float資料來做運算處理的值來的有差距,所以最後出來的畫面一定有落差。
沒有留言:
張貼留言