在旧着色器模型中生成片段/ HLSLdynamic链接的着色器

着色器模型5中有一个称为dynamic链接的特性,它通过使用接口及其在类中实现的方法来分离hlsl片段。

我对这种技术没有任何经验,我的程序使用了大约10个着色器(10个分离的文件* .hlsl),并且在不同的着色器中有一些相同的部分。 所以对我来说,将一个共同的逻辑(例如光)分离到自己的文件,并从其他着色器中使用它将是很好的。

我总是着迷于现代游戏引擎和他们的开发工具包,通过在一些内部编辑器中简单地点击,可以将这些着色器片段组合在一起。 所以开发人员可以通过这种方式创建非常复杂的场景 – select材质,灯光,粒子,animation等等,而且我觉得它非常的酷。 如果我省略了一些graphics编辑器和一个复杂的逻辑,那么这就是我想要实现的,不是吗? 只是在代码级别。

所以在着色器模型5中hlsl的dynamic链接,我有一些想法如何可以完成,但更老的着色器模型呢? 当没有着色器模型5时,引擎使用什么技术?

我相信很less有游戏开发者会使用HLSL中的dynamic链接function,因为它是一种相当有限,尴尬的抽象forms,并不像人们喜欢的那样普遍。 而且,开发人员需要保持与早期API的向后兼容性。 迄今为止还没有很多D3D11专用的游戏。

在实践中,通过简单地使用定义常用函数和数据结构的头文件,然后编写(或从工具自动生成)着色器, #include这些头文件和调用他们的function。

通过编写一个函数来表示graphics中的每个节点types,然后编写代码来生成调用所有节点函数的着色器的main()函数,可以设想实现一个虚幻风格的基于节点的着色器系统根据用户指定的连接和值来设置参数和返回值。 生成的着色器然后将被传递给通常的着色器编译器,该着色器编译器优化掉那个特定着色器未使用的任何代码。