Cocos Creator:Surface Shader 组装

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

Surface Shader 组装

Shader片段组装器

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

CCProgram standard-vs %{
    //includes
}%

CCProgram shadow-caster-vs %{
    //includes
}%

CCProgram standard-fs %{
    //includes
}%

CCProgram shadow-caster-fs %{
    //includes
}%

CCProgram reflect-map-fs %{
    //includes
}%

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

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

include 两种方式

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

//include from CCProgram
#include <macro-remapping>

//include from file
#include <surfaces/effect-macros/common-macros>

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

主要部分

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

1、宏

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

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

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

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

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

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

2、通用头文件

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

//Vertex Shader
CCProgram standard-vs %{
    ...
    #include <surfaces/includes/common-vs>
    ...
}%

//Fragment Shader
CCProgram standard-fs %{
    ...
    #include <surfaces/includes/common-fs>
    ...
}%

3、Surface Shader 主体

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

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

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

如下所示:

CCProgram standard-fs %{
    ...
    #include <shared-ubos>
    #include <surface-fragment>
    ...
}%

4、光照模型

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

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

//Standard PBR Lighting
#include <lighting-models/includes/standard>

//Toon Lighting
#include <lighting-models/includes/toon>

5、表面材质数据结构

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

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

//Vertex Shader
//Standard
#include <surfaces/includes/standard-fs>
//Toon
#include <surfaces/includes/toon-fs>

//Fragment Shader
//Standard
#include <surfaces/includes/standard-fs>
//Toon
#include <surfaces/includes/toon-fs>

6、主函数

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

//standard-vs:
#include <shading-entries/main-functions/render-to-scene/vs>

//shadow-caster-vs:
#include <shading-entries/main-functions/render-to-shadowmap/vs>

//standard-fs:
#include <shading-entries/main-functions/render-to-scene/fs>

//shadow-caster-fs:
#include <shading-entries/main-functions/render-to-shadowmap/fs>

3D建模学习工作室 翻译整理,转载请注明出处!

上一篇:Cocos Creator:Shader 类型 (mvrlink.com)

下一篇:Cocos Creator:Vertex Shader 的输入值 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号