宏定义与重映射

Surface Shader 内部计算时会用到一些宏开关,这些宏以 CC_SURFACES_ 开头。

注意:以 CC_SURFACES_ 开头的宏不会出现在材质面板上。

以下是完整的宏列表:

宏名类型含义
CC_SURFACES_USE_VERTEX_COLORBOOL是否使用顶点色
CC_SURFACES_USE_SECOND_UVBOOL是否使用2uv
CC_SURFACES_USE_TWO_SIDEDBOOL是否使用双面法线,用于双面光照
CC_SURFACES_USE_TANGENT_SPACEBOOL是否使用切空间(使用法线图或各向异性时必须开启)
CC_SURFACES_TRANSFER_LOCAL_POSBOOL是否在 FS 中访问模型空间坐标
CC_SURFACES_LIGHTING_ANISOTROPICBOOL是否开启各向异性材质
CC_SURFACES_LIGHTING_ANISOTROPIC_ENVCONVOLUTION_COUNTUINT各向异性环境光卷积采样数,为 0 表示关闭卷积计算,仅当各向异性开启时有效
CC_SURFACES_LIGHTING_USE_FRESNELBOOL是否通过相对折射率 ior 计算菲涅耳系数
CC_SURFACES_LIGHTING_TRANSMIT_DIFFUSEBOOL是否开启背面穿透漫射光(如头发、叶片、耳朵等)
CC_SURFACES_LIGHTING_TRANSMIT_SPECULARBOOL是否开启背面穿透高光(如水面、玻璃折射等)
CC_SURFACES_LIGHTING_TRTBOOL是否开启透射后内部镜面反射出的光线(如头发材质等)
CC_SURFACES_LIGHTING_TTBOOL是否开启透射后内部漫反射出的光线(用于头发材质)
CC_SURFACES_USE_REFLECTION_DENOISEBOOL是否开启环境反射除噪,仅 legacy 兼容模式下生效
CC_SURFACES_USE_LEGACY_COMPATIBLE_LIGHTINGBOOL是否开启 legacy 兼容光照模式,可使渲染效果和 legacy/standard.effect 完全一致,便于升级

注意: 如果未定义这些宏,系统内部会自动定义为默认值 0;

搜索 CCProgram macro-remapping 一段,可以看到内容有如下三部分组成:

macro-remapping

仅供面板显示的宏

  1. // ui displayed macros not used in this effect file
  2. #pragma define-meta HAS_SECOND_UV
  3. #pragma define-meta USE_TWOSIDE
  4. #pragma define-meta USE_REFLECTION_DENOISE
  5. #pragma define-meta USE_COMPATIBLE_LIGHTING

默认情况下,以 CC_ 开头的宏不会显示在材质面板上。 当我们想让某一个宏开关显示在材质面板上时,可以像下面这样操作:

1、使用 #pragma define-meta 定义一个面板宏,我们以 HAS_SECOND_UV 为例:

  1. #pragma define-meta HAS_SECOND_UV

2、将 CC_SURFACES_ 开头的宏重定向到这个宏,示例如下:

  1. #define CC_SURFACES_USE_SECOND_UV HAS_SECOND_UV

这样,在这个 Shader 对应的材质面板上,你就可以通过控制 HAS_SECOND_UV 来影响 CC_SURFACES_USE_SECOND_UV 宏的值。

在 Surface 函数中使用过的宏

如果有宏在 Shader 代码中被使用,且不是以 CC_ 开头的,会自动显示在材质面板上。 比如:

  1. // ui displayed macros used in this effect file
  2. #define CC_SURFACES_USE_VERTEX_COLOR USE_VERTEX_COLOR
  3. #if IS_ANISOTROPY || USE_NORMAL_MAP
  4. #define CC_SURFACES_USE_TANGENT_SPACE 1
  5. #endif

这种情况下,IS_ANISOTROPY 和 USE_NORMAL_MAP 会显示在材质面板上,并可以通过材质面板进行开关。

内部功能性的宏

对于某一些宏,我们不想要面板控制它,直接定义它的值即可,例如:

  1. // functionality for each effect
  2. #define CC_SURFACES_LIGHTING_ANISOTROPIC_ENVCONVOLUTION_COUNT 31

隐藏宏

如果你的 Shader 中写了一些宏,但是不想出现在材质面板上,可以用 CC_ 开头。

为了和系统内部宏有区别,建议使用 CC_USER_ 开头。

更多宏定义相关内容,可以查看 预处理宏定义