Skip to content

Fragment Shader 的输入值

内置输入列表

Vertex Shader 向 Fragment Shader 传递了许多常用变量,列表如下:

Fragment Shader 输入值类型使用时需要开启的宏含义
FSInput_worldPosvec3N/AWorld Position 世界坐标
FSInput_worldNormalvec3N/AWorld Normal 世界法线
FSInput_faceSideSignfloatN/ATwo Side Sign 物理正反面标记,可用于双面材质
FSInput_texcoordvec2N/AUV0
FSInput_texcoord1vec2N/AUV1
FSInput_vertexColorvec4N/AVertex Color 顶点颜色
FSInput_worldTangentvec3N/AWorld Tangent 世界切线
FSInput_mirrorNormalfloatN/AMirror Normal Sign 镜像法线标记
FSInput_localPosvec4CC_SURFACES_TRANSFER_LOCAL_POSLocal Position 局部坐标
FSInput_clipPosvec4CC_SURFACES_TRANSFER_CLIP_POSClip Position 投影/裁切空间坐标

宏开关

当需要使用带有宏开关的输入参数时,需要在 macro-remapping 代码段中开启相应的宏,示例代码如下:

glsl
CCProgram macro-remapping %{
    ...
    //使用 FSInput_localPos
    #define CC_SURFACES_TRANSFER_LOCAL_POS 1
    //使用 FSInput_clipPos
    #define CC_SURFACES_TRANSFER_CLIP_POS 1
    ...
}

使用说明

在任意函数中直接调用即可。

自定义传递值

在制作一些特殊效果时,需要 Vertex Shader 向 Fragment Shader 传递更多信息,此时需要我们自定义传递变量。

新增一个自定义的传递变量非常简单,我们以新增一个 testVec3 为例。

首先,在 Vertex Shader 中声明一个带 out 标记的变量,示例代码如下:

glsl
CCProgram surface-vertex %{
    ...
    out vec3 testVec3;
    ...
}

再在 Fragment Shader 声明对应的带 in 标记的变量即可,示例代码如下:

glsl
CCProgram surface-fragment %{
    ...
    in vec3 testVec3;
    ...
}

接下来就可以在 Fragment Shader 的代码中使用 testVec3 了。