Unity shader 学习记录(基础纹理篇3渐变纹理)

渐变纹理可以控制模型的漫反射,从而使模型变成卡通风格或者写实风格等。

原来计算漫反射的时候,我们都是使用表面法线和光照方向的点积结果于材质的反射率相乘来得到表面的漫反射光照,现在可以用渐变纹理来进行控制。

代码如下:

Shader "Unity Shaders Book/Chapter 7/Ramp Texture"{

    Properties{

        _Color("Color Tint", Color) = (1,1,1,1)

        _RampTex("Ramp Tex", 2D) = "white" {}

        _Specular("Specular", Color) = (1,1,1,1)

        _Gloss("Gloss", Range(8.0, 256)) = 20

    }

    SubShader{

        Pass{

            Tags {"LightMode" = "ForwardBase"}

        CGPROGRAM

        #pragma vertex vert

        #pragma fragment frag

        #include "Lighting.cginc"

        fixed4 _Color;

        sampler2D _RampTex;

        float4 _RampTex_ST;

        fixed4 _Specular;

        float _Gloss;

        //顶点着色器的输入结构体

        struct a2v{

            float4 vertex : POSITION;

            float3 normal : NORMAL;

            float4 texcoord : TEXCOORD0;

        };

        struct v2f{

            float4 pos : SV_POSITION;

            float3 worldNormal : TEXCOORD0;

            float3 worldPos : TEXCOORD1;

            float2 uv : TEXCOORD2;

        };

        v2f vert(a2v v){

            v2f o;

            o.pos = UnityObjectToClipPos(v.vertex);

            o.worldNormal = UnityObjectToWorldNormal(v.normal);

            o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;

            //使用内置的TRANSFORM_TEX宏来计算经过平铺和偏移后的纹理坐标

            o.uv = TRANSFORM_TEX(v.texcoord, _RampTex);

            return o;

        }

        fixed4 frag(v2f i) : SV_Target{

            fixed3 worldNormal = normalize(i.worldNormal);

            fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

            fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

            //使用半兰伯特模型

            fixed halfLambert = 0.5 * dot(worldNormal,worldLightDir) + 0.5;

            //使用halfLambert来构建一个纹理坐标,并用这个纹理坐标对渐变纹理_RampTex进行采样

            fixed3 diffuseColor = tex2D(_RampTex, fixed2(halfLambert,halfLambert)).rgb * _Color.rgb;

            fixed3 diffuse = _LightColor0.rgb * diffuseColor;

            fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));

            fixed3 halfDir = normalize(worldLightDir + viewDir);

            fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0,dot(worldNormal,halfDir)),_Gloss);

            return fixed4(ambient + diffuse + specular, 1.0);

        }

        ENDCG

        }

    }

    Fallback "Specular"

}

首先,没有计算反射率了,环境光直接用UNITY_LIGHTMODEL_AMBIENT.xyz,其次,在计算漫反射的时候,首先计算halfLambert,让他来当做uv,和计算反射率公式差不多来对渐变纹理进行采样,其他的单张纹理计算一样。

             //使用半兰伯特模型

            fixed halfLambert = 0.5 * dot(worldNormal,worldLightDir) + 0.5;

            //使用halfLambert来构建一个纹理坐标,并用这个纹理坐标对渐变纹理_RampTex进行采样

            fixed3 diffuseColor = tex2D(_RampTex, fixed2(halfLambert,halfLambert)).rgb * _Color.rgb;

            fixed3 diffuse = _LightColor0.rgb * diffuseColor;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值