Shader "Skin Shader" {
Properties {
_MainTex ("Diffuse (RGB)", 2D) = "white" {}
_SpecularTex ("Specular (R) Gloss (G) SSS Mask (B)", 2D) = "yellow" {}
_BumpMap ("Normal (Normal)", 2D) = "bump" {}
_BRDFTex ("BRDF Lookup (RGB)", 2D) = "gray" {}
_CurvatureScale ("Curvature Scale", Float) = 0.005
_Fresnel ("Fresnel Value", Float) = 0.2
_BumpBias ("Normal Map Blur Bias", Float) = 1.5
}

SubShader{
Tags { "Queue" = "Geometry" "RenderType" = "Opaque" }

CGPROGRAM

#pragma surface surf SkinShader fullforwardshadows
#pragma target 3.0
#pragma glsl

struct SurfaceOutputSkinShader {
fixed3 Albedo;
fixed3 Normal;
fixed3 NormalBlur;
fixed3 Emission;
fixed3 Specular;
fixed Alpha;
};

struct Input
{
float2 uv_MainTex;
INTERNAL_DATA
};

sampler2D _MainTex, _SpecularTex, _BumpMap, _BRDFTex;
float _BumpBias, _CurvatureScale, _Fresnel;

void surf (Input IN, inout SurfaceOutputSkinShader o)
{
float4 albedo = tex2D ( _MainTex, IN.uv_MainTex );
o.Albedo = albedo.rgb;
o.Normal = UnpackNormal ( tex2D ( _BumpMap, IN.uv_MainTex ) );
o.Specular = tex2D ( _SpecularTex, IN.uv_MainTex ).rgb;

o.NormalBlur = UnpackNormal( tex2Dlod ( _BumpMap, float4 ( IN.uv_MainTex, 0.0, _BumpBias ) ) );
}

inline fixed4 LightingSkinShader( SurfaceOutputSkinShader s, fixed3 lightDir, fixed3 viewDir, fixed atten )
{
s.Normal = normalize( s.Normal );
s.NormalBlur = normalize( s.NormalBlur );

float NdotL = dot( s.Normal, lightDir );
float3 h = normalize( lightDir + viewDir );

float specBase = saturate( dot( s.Normal, h ) );

float fresnel = pow( 1.0 - dot( viewDir, h ), 5.0 );
fresnel += _Fresnel * ( 1.0 - fresnel );

float spec = pow( specBase, s.Specular.g * 128 ) * s.Specular.r * fresnel;

float2 brdfUV;
float NdotLBlur = dot( s.NormalBlur, lightDir );
brdfUV.x = NdotLBlur * 0.5 + 0.5;
brdfUV.y = _CurvatureScale * dot( _LightColor0.rgb, fixed3(0.22, 0.707, 0.071 ) );
float3 brdf = tex2D( _BRDFTex, brdfUV ).rgb;

float m = atten; // Multiplier for spec and brdf.
m *= saturate( ( (NdotLBlur * 0.5 + 0.5) * 2.0) * 2.0 - 1.0);

fixed4 c;
c.rgb = (saturate(s.Albedo * lerp(saturate(NdotL) * atten, brdf * m, s.Specular.b )) + spec * m) * _LightColor0.rgb * 2;
c.a = 1;
return c;
}

ENDCG
}
FallBack "VertexLit"
}

Unity Skin Shader Optimized的更多相关文章

  1. 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&混合操作编译

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

  2. Unity Built-in Shader详解二

    这次主要讨论Unity自带的Shader中Transparent Shader Family 这个家族的Shader一共7种,原理和类型与Normal中的上差不多,只不过这些Shader是用在半透明或 ...

  3. 对Unity一个Shader编译Bug的分析(Unrecognized sampler 'samplerunity_lightmap)

    写在前面 Unity的用户量越来越大,越来越有钱,这几年摊子也铺的越来越大,所以各个版本总是有很多Bug.对于一些Bug官方在ReleaseNote里的说明是很不详细的,而对于一些渲染相关的Bug,有 ...

  4. 关于Unity中Shader的使用

    在游戏的开发过程中,程序员不太会自己去写shader,因为写起来很麻烦,而且只有Unity会报错,编译器也没有什么提示. 通常是拿别人的shader改一改,当然,程序员还是要能看懂和会一点shader ...

  5. 关于Unity中Shader的基础认识

    Shader也叫着色器,是Unity里面比较难的一个点,网上有很多别人写好的shader,我们可以下载下来用或者修改学习. Shader可以做出很多非常不错的效果,因为它是插在渲染管道里面的程序,一来 ...

  6. 关于Unity中Shader的内置值

    Unity provides a handful of builtin values for your shaders: things like current object's transforma ...

  7. Unity的shader学习2

    下面继续看基于surface的shader代码,基本与Vertex&Fragment shader差不多,只是不能写pass,然后只需要声明surface函数,就能处理所有的事情. Shade ...

  8. Unity的shader学习1

    先来看一段我们项目常见的Shader代码,这个是Vertex&Fragment shader,目前已经不常用了,不过还是适合我们理解一些基础知识和理解一些比较老的shader 代码.下次我们再 ...

  9. unity, 替换shader渲染(Rendering with Replaced Shaders)

    实现特效,尤其是一些后处理特效,经常需要将各物体的shader替换为另一套shader进行渲染到纹理,再后再进行合成或以某种叠加方式叠加到最后的画面上去. 再复杂一点儿的,可能不同的物体所用的替换sh ...

随机推荐

  1. SqlSugar常用查询实例-拉姆达表达式

    SqlSugar支持拉姆达表达式查询,匿名对象参数等,相对还是比较方便好用的. 一.查询列表: //查询列表 SqlSugarClient db = SugarContext.GetInstance( ...

  2. UDP—Socket,套接字聊天简单的聊天程序。

    思路:(发送端) 1.既然需要聊天.就应该怎么建立聊天程序,,DatagramSocket对象http://www.w3cschool.cc/manual/jdk1.6/ DatagramSocket ...

  3. Java file文件的写入和读取及下载

    File文件的写入 一.FileWriter 和BufferedWriter 结合写入文件 FileWriter是字符流写入字符到文件.默认情况下,它会使用新的内容代替文件原有的所有内容,但是,当指定 ...

  4. 设置appicon和启动图

    设置appicon General – App Icon Source 设置AppIcon 图片大小 iphone 6P(@3x) 180x180 iphone 6(@2x) iphone5/5s ( ...

  5. dx环境搭建

    我使用的是vs2012+DXSDK_Jun10 DXSDK_Jun10下载地址http://download.microsoft.com/download/A/E/7/AE743F1F-632B-48 ...

  6. linux安装git方法(转)

    转自:http://jingyan.baidu.com/article/e9fb46e16698687521f766ec.html 以下内容亲测,确实可行. 由于我的机器是linux6.7,所以省略了 ...

  7. 实现 winform 异步跨线程访问UI控件

    在开发winform时经常会用到多线程防止界面出现假死现象,比如当你单击某个按钮时,需要执行很多代码,但是在执行过程中想实时的将当前执行的情况报告给用户,类型进度条或文本什么的. 这个时候很显然,如果 ...

  8. [网络编程] TCP、UDP区别以及TCP传输原理、拥塞避免、连接建立、连接释放总结

    TCP.UDP都是属于运输层的协议,提供端到端的进程之间的逻辑通信,而IP协议(网络层)是提供主机间的逻辑通信,应用层规定应用进程在通信时所遵循的协议.一.UDP主要特点:传输的是用户数据报协议.1. ...

  9. Laravel之路——事务

    准备: 表必须是InnoDB引擎 DB::beginTransaction(); try{ $name = 'abc'; $result1 = Test::create(['name'=>$na ...

  10. Struts_json插件配置参数

    Struts中使用json需要在struts基础上加上几个包:(这里只列出了重要的几个) commons-lang-2.4.jar: jsonplugin-0[1].32.jar: 下面是配置文件中的 ...