自己整理了下,想用在自己的小项目里的,具体功能有 卡通 ,描边(含精细度),法线,高光(卡通风格有这个的话....有了的话配合贴图效果感觉也蛮不错), 边缘光,只是一些基础的功能,汇总一下暂时够用了。以后要找自己也找得到,不用做无用的重复工作。
Shader "AnimalClamp/Cartoons" {
Properties
{
_MainTex("MainTex", 2D) = "white" {}
_BumpMap("Bump Map", 2D) = "bump" {}
_Color("Main Color",color) = (1,1,1,1)
_OutlineCol("Outline Color",color) = (0,0,0,1)
_SpecColor("Spec Color",Color) = (0,0,0,1)
_RimColor("Rim Color", color)= (0,0,0,1)
_RimPower("Rim Power", range(0,2))= 0
_Outline("Thick of Outline",range(0,0.1)) = 0.02
_Smoothness("Smoothness",range(0,1)) = 0.5
_Shine("Shininess", range(0,1)) = 0
_BumpScale("BumpScale",range(0,10)) = 1
}
SubShader{
Pass {
Tags{ "LightMode" = "Always" }
Cull Front
ZWrite On
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float _Outline;
float _Smoothness;
half4 _OutlineCol;
struct v2f {
float4 pos:SV_POSITION;
};
v2f vert(appdata_full v) {
v2f o;
float3 dir = normalize(v.vertex.xyz);
float3 dir2 = v.normal;
float D = dot(dir,dir2);
dir = dir*sign(D);
dir = dir * _Smoothness + dir2 * (1 - _Smoothness);
v.vertex.xyz += dir * _Outline;
o.pos = UnityObjectToClipPos(v.vertex);
return o;
}
float4 frag(v2f i) :COLOR
{
return _OutlineCol;
}
ENDCG
}
Pass {
Tags{ "LightMode" = "ForwardBase" }
Cull Back
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
sampler2D _BumpMap;
float _Shine;
float4 _LightColor0;
float4 _Color;
float _BumpScale;
float4 _SpecColor;
float4 _RimColor;
float _RimPower;
struct v2f
{
float4 pos:SV_POSITION;
float3 lightDir:TEXCOORD0;
float3 viewDir:TEXCOORD1;
float3 normal:TEXCOORD2;
float2 uv:TEXCOORD3;
};
v2f vert(appdata_full v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.normal = v.normal;
o.lightDir = ObjSpaceLightDir(v.vertex);
o.viewDir = ObjSpaceViewDir(v.vertex);
o.uv = v.texcoord.xy;
return o;
}
float4 frag(v2f i) :COLOR
{
float4 col = tex2D(_MainTex, i.uv);
float3 normalDir = normalize(i.normal);//法线方向
float3 viewDir = normalize(i.viewDir);//视角方向
float3 lightDir = normalize(i.lightDir);//入射光照方向
float3 reflectDir = reflect(-lightDir, normalDir);//反射光线方向
float cosAngle = max(0, dot(normalDir, i.lightDir));//法线方向和光照方向夹角的余弦
float diff = (cosAngle + 1) / 2;
diff = smoothstep(0,1,diff);
float4 c = _Color * diff * _LightColor0;
//法线贴图
float3 normalMap = UnpackNormal(tex2D(_BumpMap, i.uv));
normalMap.xy *= _BumpScale;
normalMap.z = (1.0 - saturate(dot(normalMap.xy, normalMap.xy)));
float3 normalInfo = c * _LightColor0.rgb * max(0, dot(normalMap, lightDir));
//高光公式进行计算 Specular = LightColor * SpecColor * pow(max(0,dot(R,V)),Shiness),R=reflect(-L,N)
float3 specular = _SpecColor * _LightColor0.rgb * pow(max(0.0, max(0, dot(normalDir, i.lightDir))), 10/_Shine) * clamp(cosAngle, 0, 1);
//Rim Color 边缘光
float rim = 1 - max(0, dot(viewDir, normalDir));
float3 rimColor = _RimColor * pow(rim, 1 / _RimPower);
return float4(normalInfo, 1) * float4(specular, 1) + c * col + float4(rimColor, 1);
}
ENDCG
}
}
}
这个shader基本没有什么难度,就是法线的运用。我只是之前的工作稍微进行了汇总,每个功能的原理也很简单,百度一搜一大片的,用起来的话,没有特殊需求还是蛮不错的。
这个shader基本没有什么难度,就是法线的运用。我只是之前的工作稍微进行了汇总,每个功能的原理也很简单,百度一搜一大片的,用起来的话,没有特殊需求还是蛮不错的。
都说图形工程师,可能干个一两年才算刚入门。图形嘛,其实说白了就是算法算法算法,我刚开始工作的师父真的是尽心尽力地教了我许多~
其实,能把光影的效果写得很漂亮也很开心了~
争取2017.08.30之前实现一套手机可用PBR通用方案,希望可以对你有一些帮助~