为了设计上的灵活,我把shader、纹理等都封装到材质(Material)里,以方便渲染对象在不同状态下材质的切换以达到不同的渲染效果。
但涉及到shader的设计就比较麻烦,因为shader需要设置里面的参数,但由谁负责传参数给它呢?如果由渲染对象负责,那么每个材质只要有shader,就每个渲染对象更新一次,这样问题来了,一但切换了材质后怎么办?因此否定了这种做法。
另一种做法是由材质更新shader的参数,但材质怎么知道shader要什么参数呢?这样岂不是每个材质要针对不同的shader继承一个类?这样设计也不灵活。而且shader需要更新的参数有时是来自渲染对象的。
到这里就比较头痛了,到现在,我只能由shader自己主动更新自己的参数。从shader中获得参数列表,遍历并更新。但这里也有问题,当shader需要来自渲染对象中比较特殊的参数时,应该怎么取呢?例如要取水的纹理扰动值等,我不可能在渲染对象的基类抽象出一个GetWaterDistort()这样的接口吧?暂时想到的解决方法是:在每个渲染对象里定义一个表,存放shader需要的参数,key为shader的参数名,value为其值。不过问题也出来:不知道值的size。不过可以暂时写死在一个结构体中。
不知道各位高人有什么意见,这问题困扰我太久了!