光照模型

先开个坑 慢慢填

漫反射

兰伯特光照(Lambert)

fixed4 LightingLambert (SurfaceOutput s, UnityGI gi)

半兰伯特光照(Half-Lambert)

镜面反射

Phong高光模型

Blinn-Phong

fixed4 LightingBlinnPhong (SurfaceOutput s, half3 viewDir, UnityGI gi)

高级光照模型

Cook_Torrance光照模型

inline fixed4 LightingCookTorrance (SurfaceOutput s, fixed3 lightDir, fixed3 viewDir, fixed atten)
{
    clip ( s.Alpha - _Cutoff );

    viewDir = normalize ( viewDir );
    lightDir = normalize ( lightDir );
    float3 h = normalize ( lightDir + viewDir );
    float NdotL_unsat = dot ( s.Normal, lightDir );
    float NdotH_unsat = dot ( s.Normal, h );
    float NdotL = saturate( NdotL_unsat );
    float NdotH = saturate( NdotH_unsat );
    float NdotV = saturate( dot ( s.Normal, viewDir ) );
    float VdotH = saturate( dot ( viewDir, h ) );

    float geo_numerator = 2.0 * NdotH;
    float geo_b = ( geo_numerator * NdotV ) / VdotH;
    float geo_c = ( geo_numerator * NdotL ) / VdotH;
    float geo = min( 1.0f, min( geo_b, geo_c ) );

    fixed roughness = tex2D( _Beckmann, float2 ( NdotH_unsat * 0.5 + 0.5, s.Specular ) ).r;

    float fresnel = pow( 1.0 - VdotH, 5.0 );
    fresnel *= ( 1.0 - _Fresnel );
    fresnel += _Fresnel;

    float3 spec = float3 ( fresnel * geo * roughness ) / ( NdotV * NdotL );

    fixed4 c;
    c.rgb = NdotL * (  _LightColor0.rgb * spec + s.Albedo ) * atten;
    c.a = s.Alpha;
    return c;
}

BRDF

双向反射分布函数(bidirectional reflectance distribution function)

Shader "Bank-BRDF" {
    Properties {
        _AmbiColor ("Main Color", Color) = (1, 1, 1, 1)
        _Ak ("Ambient Coef", float) = 1
        _DiffColor ("Diff Color", Color) = (1, 1, 1, 1)
        _Dk ("Diff Coef", float) = 1
        _SpecColor ("Spec Color", Color) = (1, 1, 1, 1)
        _Sk ("Sk", float) = 1
        _Sp ("Sp", Range(0, 5)) = 1
    }

    SubShader {
        Pass {
            CGPROGRAM
                #include "UnityCG.cginc"
                #pragma vertex vert
                #pragma fragment frag

                float4 _AmbiColor;
                float _Ak;
                float4 _DiffColor;
                float _Dk;
                float4 _SpecColor;
                float _Sk;
                float _Sp;

            struct v2f {
                float4 pos : POSITION;
                float3 normal : TEXCOORD0;
                float3 light : TEXCOORD1;
                float3 view : TEXCOORD2;
                float3 targent : TEXCOORD3;
                };

            v2f vert(appdata_base v) {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                o.normal = v.normal;
                o.light = ObjSpaceLightDir(v.vertex);
                o.view = ObjSpaceViewDir(v.vertex);
                o.targent = cross(v.normal, o.view);

                return o;
            }

            float4 frag(v2f i) : COLOR {
                float3 l = normalize(i.light);
                float3 t = normalize(i.targent);
                float3 v = normalize(i.view);
                float3 n = normalize(i.normal);

                float lt = dot(l, t);
                float vt = dot(v, t);
                float nl = dot(n, l);
                float nv = dot(n, v);

                float4 ambi = _AmbiColor * _Ak;
                float4 diff = _Dk * _DiffColor * saturate(nl);
                if (nl <= 0 || nv <= 0)
                    return ambi + diff;
                float p = sqrt(1 - lt * lt) * sqrt(1 - vt * vt) - lt * vt;
                float f = _Sk * pow(p, _Sp);
                float spec = f * _SpecColor * saturate(dot(l, n));
                return ambi + diff + spec;
            }
            ENDCG
        }
    } 
    FallBack "Diffuse"
}

车喷漆

透明光照模型

简单透明光罩模型

复杂透明光罩模型

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值