Shader "HairShader"
{
Properties
{
_MainTex ("Diffuse (RGB) Alpha (A)", 2D) = "white" {}
_Color ("Main Color", Color) = (0,0,0,1)
_SpecularTex ("Specular (R) Gloss (G) Anisotropic Mask (B)", 2D) = "gray" {}
_SpecularMultiplierT ("Specular Multiplier T", float) = 5.0
_SpecularMultiplierN ("Specular Multiplier N", float) = 10.0
_SpecularColor ("Specular Color", Color) = (0.5,0.5,0.5,1)
_Cutoff ("Alpha Cut-Off Threshold", float) = 0.5
_GlossInterp ( "Gloss Interploter", Range(-1,1)) = 0
_WaveSpeed ("Wave Speed", Vector) = (1,1,1,1)
_WaveSize ("Wave Size", float) = 0.1
_WavePhase ("Wave Phase", float) = 0.02
}

SubShader
{
Tags {"Queue"="Geometry" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}

Cull Off
ZWrite On
ZTest LEqual

CGPROGRAM
#pragma surface surf Aniso vertex:vert
#pragma target 3.0

struct SurfaceOutputAniso
{
fixed3 Albedo;
fixed3 Normal;
fixed3 Emission;
half Specular;
fixed Gloss;
fixed Alpha;
fixed AnisoMask;

half3 tangentV;
};

struct Input
{
float2 uv_MainTex;
half3 tangentV;
};

float4 _WaveSpeed;
float _WaveSize;
float _WavePhase;

void vert(inout appdata_full v, out Input o)
{
UNITY_INITIALIZE_OUTPUT(Input, o);

float3 waves = _WaveSize * v.tangent.xyz;
float3 freq = _Time.y * _WaveSpeed.xyz;
v.vertex.xyz += cos(freq + v.vertex.xyz * _WavePhase) * waves;
o.tangentV = v.tangent.xyz;
}

sampler2D _MainTex, _SpecularTex;
float _SpecularMultiplierT,_SpecularMultiplierN, _GlossInterp, _Cutoff;
fixed4 _SpecularColor, _Color;

void surf (Input IN, inout SurfaceOutputAniso o)
{
fixed4 albedo = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = lerp(albedo.rgb,albedo.rgb*_Color.rgb,0.5);
o.Alpha = albedo.a;
clip (o.Alpha - _Cutoff);
fixed3 spec = tex2D(_SpecularTex, IN.uv_MainTex).rgb;
o.Specular = spec.r;
o.Gloss = spec.g;
o.AnisoMask = spec.b;
o.tangentV = IN.tangentV;
}

inline fixed4 LightingAniso (SurfaceOutputAniso s, fixed3 lightDir, fixed3 viewDir, fixed atten)
{
half3 h = normalize(lightDir + viewDir);
float NdotL = saturate(dot(s.Normal, lightDir));

half3 T = normalize(cross( s.Normal, s.tangentV));
half3 L = normalize(lightDir);
half3 V = -normalize(viewDir);

float sq1 = (1.0-abs(dot(T, L)));
float sq2 = (1.0-abs(dot(T, V)));
float aniso = abs(dot(T,L) * dot(s.Normal,V));
aniso += sq1 * sq2;
aniso = pow(aniso, _SpecularMultiplierT);

float blinn = pow(dot(s.Normal, h), _SpecularMultiplierN) * s.Gloss;

float spec = saturate(lerp(blinn, aniso, s.AnisoMask + _GlossInterp) * s.Specular) * _SpecularColor;

fixed4 c;
c.rgb = spec;
c.a = s.Alpha;
return c;
}
ENDCG

}
FallBack Off
}

Unity Kajiya Hair Shader Mod by Normals的更多相关文章

  1. Unity Diffuse Metal Shader Mod

    Shader "MetalShader" { Properties { _MainTex ("Base (RGB) RefStrGloss (A)", 2D) ...

  2. unity之初识shader

    自己做个总结先.当然文中很多内容都是从各位大神的文档当中看的.我只是站在巨人的肩膀上.       首先什么是shader?其实就是一个在显示屏当中的显示程序,俗称着色器.它可以定义物体在硬件显示屏当 ...

  3. 【unity shaders】:Unity中的Shader及其基本框架

    shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...

  4. 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)  ...

  5. 【Unity Shaders】Shader学习资源和Surface Shader概述

    写在前面 写这篇文章的时候,我断断续续学习Unity Shader半年了,其实还是个门外汉.我也能体会很多童鞋那种想要学好Shader却无从下手的感觉.在这个期间,我找到一些学习Shader的教程以及 ...

  6. unity 内置shader

    几个有用的Unity 内置shader: (一)Standard RenderingMode:Opaque为实体渲染,更改Color的透明通道不会有影响:Cutout会把图片的透明通道显示出来,非严格 ...

  7. Unity内置shader 下载

    Unity内置shader  4.3.1 版本的  其他版本可以自己修改名称 下载地址 http://download.unity3d.com/download_unity/builtin_shade ...

  8. Unity 3d中Shader是什么,可以吃吗?

    众所周知,Unity3d是一款跨平台非常广的游戏引擎,上手容易,界面友好,集成功能众多,是目前开发手游的主流引擎.本人有幸使用Unity 3d进行开发已一年多时间,已领略了这歀引擎的强大之处. 编写s ...

  9. 【Unity Shaders】Shader中的光照

    写在前面 自己写过Vertex & Fragment Shader的童鞋,大概都会对Unity的光照痛恨不已.当然,我相信这是因为我们写得少...不过这也是由于官方文档对这方面介绍很少的缘故, ...

随机推荐

  1. C#结构内存布局介绍

    转载:http://www.csharpwin.com/csharpspace/10455r2800.shtml 本来打算写一篇文章,详细地讨论一下结构的内存布局,但是想了下,跟路西菲尔的这篇文章也差 ...

  2. SQL SERVER排序函数

    排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数: 1.row_number 2.rank 3.dense_rank 4.ntile 下面分别介绍一 ...

  3. 【转】怎样创建一个Xcode插件(Part 1)

      原文:How To Create an Xcode Plugin: Part 1/3 原作者:Derek Selander 译者:@yohunl 译者注:原文使用的是xcode6.3.2,我翻译的 ...

  4. 理解java Web项目中的路径问题

    本文以项目部署在tomcat服务器为例,其他相信也是一样的. 先说明请求页面的写法,在web中,页面路径主要写的有以下几种 1.请求重定向 2.浏览器的请求被服务器请求到新页面(我称为“转发”) 3. ...

  5. 最近采用Instruments

    最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...

  6. 解决SDK Manager无法更新问题

    因为google被封了,导致Android SDK Manager无法更新,解决方案如下: 1.选择tools->options,跳出Settings页面 2.设置HTTP Proxy代理,设置 ...

  7. iOS: 学习笔记, swift扩展

    // // YYExtension.swift // // Created by yao_yu on 14-7-18. // Copyright (c) 2014年 yao_yu. All right ...

  8. 2016022611 - redis订阅发布命令集合

    redis消息订阅发布命令 参考地址:http://www.yiibai.com/redis/redis_pub_sub.html 消息发送者发送消息,通过redis的channal,消息接收者获取消 ...

  9. linux创建交换分区

    一.SWAP 概述 当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到S ...

  10. CoreProfiler/NanoProfiler

    使用CoreProfiler/NanoProfiler实现跨平台&应用的整合性能调试 摘要 NanoProfiler是一个开源.NET性能调试类库,CoreProfiler是其.NET Cor ...