Surface Shader 组装

Shader片段组装器

在内置的 Surface Shader 文件中,你会看到下面的代码片段:

  1. CCProgram standard-vs %{
  2. //includes
  3. }%
  4. CCProgram shadow-caster-vs %{
  5. //includes
  6. }%
  7. CCProgram standard-fs %{
  8. //includes
  9. }%
  10. CCProgram shadow-caster-fs %{
  11. //includes
  12. }%
  13. CCProgram reflect-map-fs %{
  14. //includes
  15. }%

这类以 xxx-vs, xxx-fs 命名的 CCProgram 代码片段,就是我们的组装器。

在这些代码片段中,我们使用 #include 关键字,根据需要,引入不同模块头的文件,按顺序组装每个Shader。

include 两种方式

在这些 include 中,你可以看到如下两种情况:

  1. //include from CCProgram
  2. #include <macro-remapping>
  3. //include from file
  4. #include <surfaces/effect-macros/common-macros>

我们可以引入一个外部 chunk 文件,也可以通过名字,引入一个先前定义好的 CCProgram,比如 macro-remapping。

主要部分

standard-fs 为例,我们可以看到整个 Fragment Shader 的组装分为以下 6 个部分。

1、宏

首先需要包含必要的内部宏映射和通用宏定义。

宏映射使用在 Macro Remapping 一段中描述的自定义 CCProgram 代码块或 chunk 文件。

接下来需要包含通用宏定义文件 common-macros,如下所示:

  1. #include <macro-remapping>
  2. #include <surfaces/effect-macros/common-macros>

对于一些特殊渲染用途的 Shader 而言,建议直接包含对应渲染用途的宏定义文件,以 ShadowMap 为例:

  1. CCProgram shadow-caster-fs %{
  2. ...
  3. #include <surfaces/effect-macros/render-to-shadowmap>
  4. ...
  5. }%

2、通用头文件

根据 当前的 Shader 类型(Shader Stage) 来选择对应的通用头文件,如下所示:

  1. //Vertex Shader
  2. CCProgram standard-vs %{
  3. ...
  4. #include <surfaces/includes/common-vs>
  5. ...
  6. }%
  7. //Fragment Shader
  8. CCProgram standard-fs %{
  9. ...
  10. #include <surfaces/includes/common-fs>
  11. ...
  12. }%

3、Surface Shader 主体

这个部分是 Surface Shader 中的主体部分。

比如外部常量 uniforms,shared-ubos 代码块。

以及 Surface Shader 中,用户可以控制的主体函数,比如内置着色器里的 surface-vertex 和 surface-fragment 代码段。

如下所示:

  1. CCProgram standard-fs %{
  2. ...
  3. #include <shared-ubos>
  4. #include <surface-fragment>
  5. ...
  6. }%

4、光照模型

此部分为可选项,Vertex Shader ,以及渲染到 ShadowMap 时,不需要。

这个部分的作用,是使用 光照模型名称 来选择对应的头文件,如下所示:

  1. //Standard PBR Lighting
  2. #include <lighting-models/includes/standard>
  3. //Toon Lighting
  4. #include <lighting-models/includes/toon>

5、表面材质数据结构

此部分为可选项,渲染到 ShadowMap 时,不需要。

选择与光照模型对应的表面材质数据结构,如下所示:

  1. //Vertex Shader
  2. //Standard
  3. #include <surfaces/includes/standard-fs>
  4. //Toon
  5. #include <surfaces/includes/toon-fs>
  6. //Fragment Shader
  7. //Standard
  8. #include <surfaces/includes/standard-fs>
  9. //Toon
  10. #include <surfaces/includes/toon-fs>

6、主函数

使用渲染用途名称 + Shader 类型(Shader Stage) 来选择对应的主函数头文件,如下图所示:

  1. //standard-vs:
  2. #include <shading-entries/main-functions/render-to-scene/vs>
  3. //shadow-caster-vs:
  4. #include <shading-entries/main-functions/render-to-shadowmap/vs>
  5. //standard-fs:
  6. #include <shading-entries/main-functions/render-to-scene/fs>
  7. //shadow-caster-fs:
  8. #include <shading-entries/main-functions/render-to-shadowmap/fs>

更多信息,可参考 内置 Surface Shader 导读