US3S2L9——渐变纹理基础实现

渐变纹理基础Shader实现

Shader 属性相关

  • 漫反射颜色
  • 渐变纹理
  • 高光反射颜色
  • 光泽度
1
2
3
4
5
6
7
Properties
{
_MainColor("MainColor", Color) = (1, 1, 1, 1)
_RampTex("RampTex", 2D) = ""{}
_SpecularColor("SpecularColor", Color) = (1, 1, 1, 1)
_SpecularNum("SpecularNum", Range(8, 256)) = 18;
}

结构体相关

  • 顶点着色器中传入:

    可以使用 UnityCG.cginc​ 中的 appdata_base​,其中包含了我们需要的顶点、法线相关数据

    1
    2
    3
    4
    5
    6
    7
    // UnityCG.cginc​内定义,无需自己再定义
    struct appdata_base {
    float4 vertex : POSITION; //模型空间中的顶点位置
    float3 normal : NORMAL; //顶点法线
    float4 texcoord : TEXCOORD0; //第一组纹理坐标
    UNITY_VERTEX_INPUT_INSTANCE_ID
    };
  • 片元着色器中传入:

    自定义一个结构体,其中包含 裁剪空间下坐标、世界空间下顶点坐标、世界空间下法线方向

    1
    2
    3
    4
    5
    6
    struct v2f
    {
    float4 pos: SV_POSITION; //裁剪空间下坐标
    float3 worldPos: TEXCOORD0; //世界空间下顶点坐标
    float3 worldNormal: TEXCOORD1; //世界空间下法线方向
    };

顶点着色器回调函数内容

  1. 顶点坐标模型转裁剪
  2. 顶点坐标模型转世界
  3. 法线从模型转世界
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// appdata_base 是 UnityCG.cginc 内定义,无需自己再定义
struct appdata_base {
float4 vertex : POSITION; //模型空间中的顶点位置
float3 normal : NORMAL; //顶点法线
float4 texcoord : TEXCOORD0; //第一组纹理坐标
UNITY_VERTEX_INPUT_INSTANCE_ID
};

struct v2f
{
float4 pos: SV_POSITION; //裁剪空间下坐标
float3 worldPos: TEXCOORD0; //世界空间下顶点坐标
float3 worldNormal: TEXCOORD1; //世界空间下法线方向
};

v2f vert (appdata_base v)
{
v2f data;
data.pos = UnityObjectToClipPos(v.vertex);
data.worldPos = mul(unity_ObjectToWorld, v.vertex);
data.worldNormal = UnityObjectToWorldNormal(v.normal);
return data;
}

这里并不需要去计算 uv 坐标,因为渐变纹理的 uv 坐标是通过半兰伯特光照模型的后半部分得到的

片元着色器回调函数内容

  1. 计算光的方向

  2. 计算半兰伯特光照后半部分公式值

    halfLambertNum=(标准化后物体表面法线向量标准化后光源方向向量)×0.5+0.5halfLambertNum = (\overrightarrow{标准化后物体表面法线向量} \cdot \overrightarrow{标准化后光源方向向量}) \times 0.5 + 0.5

  3. 利用该值从渐变纹理中取出对应颜色,参与漫反射光照计算 得出漫反射颜色

    Color渐变纹理=tex2D(halfLambertNum,halfLambertNum)diffuseColor=Color光源×Color材质的漫反射×Color渐变纹理Color_{渐变纹理} = tex2D(halfLambertNum, halfLambertNum )\\ diffuseColor = Color_{光源} \times Color_{材质的漫反射} \times Color_{渐变纹理}

  4. 计算Blinn Phong光照模型,其中的漫反射光照颜色使用上一步计算出来的颜色

显示效果:

image