Hologram Shader

来源:互联网 发布:php技术文章 编辑:程序博客网 时间:2024/05/22 16:50

全息图Shader效果图如下:
这里写图片描述
全息图是啥,自己百度下吧,(单一光照射。 传统的照片呈现的是真实的物理图像,而全息图则包含了被记录物体的尺寸、形状、亮度和对比度等信息。这些信息储存在一个很微小但却很复杂的干涉模式中。这个干涉模式是由激光产生的)

Shader代码如下:

Shader "Custom/MyHologram" {    Properties {            _MainTex ("Main Tex ", 2D) = "white" {}  //主纹理            _BumpMap("Bumpmap",2D)="bump"{}    //法线贴图            _RimColor ("Rim Color", Color) = (0.26,0.7,1.0,0.0)  //边缘光颜色            _RimPower ("Rim Power", Range(0.1,8.0)) = 3.0  //边缘光放大倍数            _ClipPower("Clip Power",Range(0.0,301.0))=200.0 //分割强度  参见surfaceshader examples 中Slices via World Space Position例子,值越大条纹越细            _Brightness("Brightness",Range(0.0,3.0))=1.5  //光强            _DiffuseAmount("Diffuse Amount",Range(0.0,1.0))=0.0  //渐变比例值,看后面lerp函数就明白        }    SubShader {           Tags{               "RenderType"="Transparent"               "Queue"="Transparent"               "IgnoreProjector"="True"           }           Pass           {              ZWrite On    // 写入深度缓存的作用就是为ZTest的比较做准备              ColorMask 0   //关闭所有颜色渲染通道, 默认是渲染RGBA通道           }           CGPROGRAM            #pragma surface surf Lambert alpha noambient nolightmap nodirlightmap novertexlights            struct Input{                  float2 uv_MainTex;                  float2 uv_BumpMap;                  float3 viewDir;                  float3 worldPos;                      float4 screenPos;                  };            sampler2D _MainTex;            sampler2D _BumpMap;            float4 _RimColor;            float _RimPower;            float _ClipPower;            float _Brightness;            float _DiffuseAmount;            void surf(Input IN,inout SurfaceOutput o)            {               //screenPos是一个三维点,但是用齐次坐标的形式表示出来就是(x,y,z,w)               //根据齐次坐标的性质。(x,y,z,w)的齐次坐标对应三维点(x/w,y/w,z/w)               float2 screenUV=IN.screenPos.xy/IN.screenPos.w; //实际的屏幕xy的UV值。               //frac是取小数的函数,如1.23取出来就是0.23               //clip 如果输入向量中的任何元素小于0,则丢弃当前像素。               if(_ClipPower<=300.0f)                 clip(frac(screenUV.y*_ClipPower)-0.5);                half4 basecol=tex2D(_MainTex,IN.uv_MainTex);               //灰度值               half3 graycol=dot(basecol.rgb,float3(0.3,0.59,0.11));               o.Albedo=basecol; //lerp(graycol,basecol,_DiffuseAmount);               //法线贴图               o.Normal=UnpackNormal(tex2D(_BumpMap,IN.uv_BumpMap));               //边缘光               half rim=1.0-saturate(dot(normalize(IN.viewDir),o.Normal));               o.Emission=lerp(_RimColor.rgb * pow (rim, _RimPower) * _Brightness,basecol,_DiffuseAmount);               o.Alpha = o.Emission;            }          ENDCG    }       FallBack "Diffuse"}

另外需要注意的是,在任务模型上挂一个点光源,颜色、强度什么自己看着设就好,不明白的地方,留言交流。。。

0 0
原创粉丝点击