zoukankan      html  css  js  c++  java
  • Unity shader: Bank BRDF

    Back BRDF是一种 模拟 金属表面 的 各向异性 光泽的经验模型,具体公式参照 GPU 编程与CG 语言之阳春白雪下里巴人 中120页的公式(10-14)

     1 Shader "Custom/Bank-BRDF" {
     2     Properties {
     3         _AmbiColor ("Main Color", Color) = (1, 1, 1, 1)
     4         _Ak ("Ambient Coef", float) = 1
     5         _DiffColor ("Diff Color", Color) = (1, 1, 1, 1)
     6         _Dk ("Diff Coef", float) = 1
     7         _SpecColor ("Spec Color", Color) = (1, 1, 1, 1)
     8         _Sk ("Sk", float) = 1
     9         _Sp ("Sp", Range(0, 5)) = 1
    10     }
    11 
    12     SubShader {
    13         Pass {
    14             CGPROGRAM
    15             #include "UnityCG.cginc"
    16             #pragma vertex vert
    17             #pragma fragment frag
    18 
    19             float4 _AmbiColor;
    20             float _Ak;
    21             float4 _DiffColor;
    22             float _Dk;
    23             float4 _SpecColor;
    24             float _Sk;
    25             float _Sp;
    26 
    27             struct v2f {
    28                 float4 pos : POSITION;
    29                 float3 normal : TEXCOORD0;
    30                 float3 light : TEXCOORD1;
    31                 float3 view : TEXCOORD2;
    32                 float3 targent : TEXCOORD3;
    33             };
    34 
    35             v2f vert(appdata_base v) {
    36                 v2f o;
    37                 o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
    38                 o.normal = v.normal;
    39                 o.light = ObjSpaceLightDir(v.vertex);
    40                 o.view = ObjSpaceViewDir(v.vertex);
    41                 o.targent = cross(v.normal, o.view);
    42 
    43                 return o;
    44             }
    45 
    46             float4 frag(v2f i) : COLOR {
    47                 float3 l = normalize(i.light);
    48                 float3 t = normalize(i.targent);
    49                 float3 v = normalize(i.view);
    50                 float3 n = normalize(i.normal);
    51 
    52                 float lt = dot(l, t);
    53                 float vt = dot(v, t);
    54                 float nl = dot(n, l);
    55                 float nv = dot(n, v);
    56 
    57                 float4 ambi = _AmbiColor * _Ak;
    58                 float4 diff = _Dk * _DiffColor * saturate(nl);
    59 
    60                 if (nl <= 0 || nv <= 0)
    61                     return ambi + diff;
    62 
    63                 float p = sqrt(1 - lt * lt) * sqrt(1 - vt * vt) - lt * vt;
    64                 float f = _Sk * pow(p, _Sp);
    65                 float spec = f * _SpecColor * saturate(dot(l, n));
    66 
    67                 return ambi + diff + spec;
    68             }
    69             ENDCG
    70         }
    71     } 
    72     FallBack "Diffuse"
    73 }

    效果如下:

  • 相关阅读:
    Use MusicBrainz in iOS(三)查询专辑的完整信息
    内存寻址一(分段)
    POJ 1018 Communication System (动态规划)
    利用Eclipse中的Maven构建Web项目(二)
    cocos2d-x2.2.3学习
    (排序算法整理)NEFU 30/32
    POJ 1066 昂贵的聘礼
    2014年腾讯暑假实习软件开发笔试题汇总
    Android学习之——自己搭建Http框架(1)
    C 语言之预处理 ---------文件包括
  • 原文地址:https://www.cnblogs.com/foxianmo/p/4732606.html
Copyright © 2011-2022 走看看