首先说说原理,原理比较简单就是通过顶点格式来生成。简单说就是这样的。ShaderGen类是生成器。负责最后所有的的GPU代码的生成。ShaderGen的getShader函数通过把格式转换成一个64位的哈希数字,然后放到一个容器里面去。ShaderComponent ShaderConnector 以及这些类的派生类都是用来做生成GPU代码的结构部分的内容。如果说一个GPU代码
struct IN
{
float 3 point : POINT;
}
就是用来生成出来这部分的代码的。
ShaderFeature ShaderFeatureHLSL以及这些类的派生类。这些是非常关键的。生成的VS 和PS代码就是靠这些类的派生类来实现的。类的processVert函数用来生成VS代码,processPix用来生成PS代码。这个时候比如要你写一些引擎本身不支持的特效,那么你需要继承ShaderFeatureHLSL,来实现这2个函数。当然这个类还其他的函数功能是类似的。我就不在重复了。DeclareFeatureType FEATUREMGR->registerFeature()ImplementFeatureType 这3个也很关键。你怎么把你写的东西让GPU代码生成器知道并且生成出来,这3个宏很关键。前2个宏保证你的代码可以让GPU代码生成器生成出来你需要的代码。最后一个宏控制生成的顺序。比如说是先处理法线贴图还是高光贴图?这些的生成顺序是什么就靠这个宏了,这个宏有一个参数来控制顺序。不过,特别要注意的是。这个顺序只保证大家是在同一个类型的情况下才有顺序。所以要注意,不然可能会出现你不想要的结果。可以看看他的排序函数_typeCmp。而且建议一定要看看。