為了設(shè)計(jì)上的靈活,我把shader、紋理等都封裝到材質(zhì)(Material)里,以方便渲染對(duì)象在不同狀態(tài)下材質(zhì)的切換以達(dá)到不同的渲染效果。
但涉及到shader的設(shè)計(jì)就比較麻煩,因?yàn)閟hader需要設(shè)置里面的參數(shù),但由誰負(fù)責(zé)傳參數(shù)給它呢?如果由渲染對(duì)象負(fù)責(zé),那么每個(gè)材質(zhì)只要有shader,就每個(gè)渲染對(duì)象更新一次,這樣問題來了,一但切換了材質(zhì)后怎么辦?因此否定了這種做法。
另一種做法是由材質(zhì)更新shader的參數(shù),但材質(zhì)怎么知道shader要什么參數(shù)呢?這樣豈不是每個(gè)材質(zhì)要針對(duì)不同的shader繼承一個(gè)類?這樣設(shè)計(jì)也不靈活。而且shader需要更新的參數(shù)有時(shí)是來自渲染對(duì)象的。
到這里就比較頭痛了,到現(xiàn)在,我只能由shader自己主動(dòng)更新自己的參數(shù)。從shader中獲得參數(shù)列表,遍歷并更新。但這里也有問題,當(dāng)shader需要來自渲染對(duì)象中比較特殊的參數(shù)時(shí),應(yīng)該怎么取呢?例如要取水的紋理擾動(dòng)值等,我不可能在渲染對(duì)象的基類抽象出一個(gè)GetWaterDistort()這樣的接口吧?暫時(shí)想到的解決方法是:在每個(gè)渲染對(duì)象里定義一個(gè)表,存放shader需要的參數(shù),key為shader的參數(shù)名,value為其值。不過問題也出來:不知道值的size。不過可以暫時(shí)寫死在一個(gè)結(jié)構(gòu)體中。
不知道各位高人有什么意見,這問題困擾我太久了!