include 机制

头文件

Surface Shader 中,包含了多个光照模型,如 standard,toon 等。

同时,我们拥有不同的渲染用途,如 render-to-scene, render-to-shadowmap 等。

不同的光照模型拥有不同的表面材质数据结构和光照计算函数,不同的渲染用途之间,流程上会有细微的差别。

如果为不同的光照模型和不同的渲染用途编写独立的代码,会使整个架构很难维护。

因此,在 Surface Shader 中,我们将不同光照模型的方法和结构体,以相同的名字定义在不同的头文件中,再使用 include 进行组合

这样就可以很容易实现,在同样的流程下,通过切换头文件实现不同的光照模型。

比如,在下面的代码中,我们通过 #include 引入 SurfacesMaterialData 的定义,函数中使用的结构体,就是 PBR 表面材质数据结构体。

  1. //PBR 表面材质
  2. #include <surfaces/data-structures/standard>
  3. #define CC_SURFACES_FRAGMENT_MODIFY_SHARED_DATA
  4. void SurfacesFragmentModifySharedData(inout SurfacesMaterialData surfaceData)
  5. {
  6. // set user-defined data to surfaceData
  7. }

如果我们更换它的头文件:

  1. //toom 表面材质
  2. #include <surfaces/data-structures/toon>
  3. #define CC_SURFACES_FRAGMENT_MODIFY_SHARED_DATA
  4. void SurfacesFragmentModifySharedData(inout SurfacesMaterialData surfaceData)
  5. {
  6. // set user-defined data to surfaceData
  7. }

此时的 SurfacesMaterialData 使用的就是 surfaces/data-structures/toon 中定义的结构体。

CCProgram

在 Surface Shader 中,CCProgram 包含的内容就是纯粹的 GLSL 代码内容。 我们可以将 Shader 分割到不同的 CCProgram 里形成代码片段,然后通过 include 进行引用。

以下面代码为例:

  1. CCProgram shared-ubos %{
  2. ...
  3. }%
  4. CCProgram macro-remampping %{
  5. ...
  6. }%
  7. CCProgram vs %{
  8. #include<shared-ubos>
  9. #include<macro-remapping>
  10. }%
  11. CCProgram fs %{
  12. #include<shared-ubos>
  13. #include<macro-remapping>
  14. }%

注意:使用 include 引用 CCProgram 定义的代码片段时,仅限本文件内。