unity 眼球效果 eyes shader
上图注意:为了避免虹膜在莫个光照角度产生平板光,需要把模型虹膜部分微微往下凹上shader眼睛部分和眼睛前面晶体部分是分开2个shader眼睛部分Shader "Hero/Eye" {Properties{//cornea角膜//Iris虹膜黑眼球//sclera巩膜 眼白_Lum("Luminance", Range(0, 10)) = 4_MainTex("Base (RGB)", 2D) =
·
上图
注意:为了避免虹膜在莫个光照角度产生平板光,需要把模型虹膜部分微微往下凹
上shader 眼睛部分和眼睛前面晶体部分是分开2个shader
眼睛部分
Shader "Hero/Eye" {
Properties{
//cornea角膜
//Iris虹膜 黑眼球
//sclera巩膜 眼白
_Lum("Luminance", Range(0, 10)) = 4
_MainTex("Base (RGB)", 2D) = "white" {}
_IrisColor("cornea Color", Color) = (1, 1, 1, 1)
_SCCornea("Specular Color", Color) = (1, 1, 1, 1)
_NormalIrisTex("NormalIrisTex (RGB)", 2D) = "white" {}
_NormalIrisDetialTex("Normal Iris Detial Tex (RGB)", 2D) = "white" {}
_GLCornea("gloss", Range(0, 2)) = 0.5
_GLIris("Iris Gloss", Range(0, 2)) = 0.5
_SPIris("Iris Specular Power", Range(1, 100)) = 20
_ReflAmount("ReflAmount", Range(0, 2)) = 1
_Cubemap("CubeMap", CUBE) = ""{}
}
SubShader{
pass{
Tags{ "LightMode" = "ForwardBase" }
Cull Back
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float _SPIris;
float _Lum;
float _ReflAmount;
samplerCUBE _Cubemap;
float4 _LightColor0;
float4 _SCCornea;
float4 _IrisColor;
float _GLCornea;
float _GLIris;
sampler2D _MainTex;
sampler2D _NormalIrisTex;
sampler2D _NormalIrisDetialTex;
float4 _MainTex_ST;
struct v2f {
float4 pos : SV_POSITION;
float2 uv_MainTex : TEXCOORD0;
float3 lightDir : TEXCOORD1;
float3 viewDir : TEXCOORD2;
float3 normal : 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_MainTex = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
#define PIE 3.1415926535
float4 frag(v2f i) :COLOR
{
float3 viewDir = normalize(i.viewDir);
float3 lightDir = normalize(i.lightDir);
float3 H = normalize(lightDir + viewDir);
float3 N = normalize(i.normal);
float3 c = tex2D(_MainTex, i.uv_MainTex);
/*
*这部分是关于虹膜的漫反射颜色,只是颜色
*/
c=c*_IrisColor;
/*
*这部分是计算角膜的PBR镜面反射
*/
float _SP;
_SP =pow(8192, _GLCornea);
float d = (_SP + 2) / (8 * PIE) * pow(clamp(dot(N, H),0,1), _SP);
float f = _SCCornea + (1 - _SCCornea)*pow(2, -10 * dot(H, lightDir));
float k = min(1, _GLCornea + 0.545);
float v = 1 / (k* dot(viewDir, H)*dot(viewDir, H) + (1 - k));
float SpecIns = d*f*v;
/*
*这部分是计算虹膜和巩膜的PBR镜面反射
*/
float3 n2;
n2 = UnpackNormal(tex2D(_NormalIrisTex, i.uv_MainTex));
_SP = pow(8192, _GLIris);
d = (_SP + 2) / (8 * PIE) * pow(clamp(dot(n2, H),0,1), _SP);
f = _SCCornea + (1 - _SCCornea)*pow(2, -10 * dot(H, lightDir));
k = min(1, _GLIris + 0.545);
v = 1 / (k* dot(viewDir, H)*dot(viewDir, H) + (1 - k));
float3 refDir = reflect(-viewDir, N);
float3 ref = texCUBElod(_Cubemap, float4(refDir, 0.5 - _GLCornea*0.5)).rgb;
float3 diff;
float roughSpecIns = d*f*v;
diff = dot(lightDir, UnpackNormal(tex2D(_NormalIrisDetialTex, i.uv_MainTex)));
float3 roughSpec = roughSpecIns*c;
return float4(c *(diff)* _Lum + roughSpec * _SPIris + SpecIns + Luminance(ref)* _ReflAmount, 1) * _LightColor0;
}
ENDCG
}
}
}
眼睛前面晶体部分
Shader "Hero/EyeCrystal" {
Properties{
//cornea角膜
//Iris虹膜 黑眼球
//sclera巩膜 眼白
_AlphaVal ("AlphaVal", Float) = 0.5
_BaseColor("Base Color", Color) = (1, 1, 1, 1)
_SCCornea("Specular Color", Color) = (1, 1, 1, 1)
_GLCornea("gloss", Range(0, 2)) = 0.5
_ReflAmount("ReflAmount", Range(0, 2)) = 1
_Cubemap("CubeMap", CUBE) = ""{}
}
SubShader{
pass{
Tags{ "LightMode" = "ForwardBase" "RenderType" = "Transparent"}
Blend One OneMinusSrcAlpha
Cull Back
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float _AlphaVal;
float _ReflAmount;
samplerCUBE _Cubemap;
float4 _LightColor0;
float4 _SCCornea;
float4 _BaseColor;
float _GLCornea;
struct v2f {
float4 pos : SV_POSITION;
float2 uv_MainTex : TEXCOORD0;
float3 lightDir : TEXCOORD1;
float3 viewDir : TEXCOORD2;
float3 normal : 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);
return o;
}
#define PIE 3.1415926535
float4 frag(v2f i) :COLOR
{
float3 viewDir = normalize(i.viewDir);
float3 lightDir = normalize(i.lightDir);
float3 H = normalize(lightDir + viewDir);
float3 N = normalize(i.normal);
/*
*这部分是关于虹膜的漫反射颜色,只是颜色
*/
float3 c=_BaseColor;
/*
*这部分是计算角膜的PBR镜面反射
*/
float _SP;
_SP =pow(8192, _GLCornea);
float d = (_SP + 2) / (8 * PIE) * pow(clamp(dot(N, H),0,1), _SP);
float f = _SCCornea + (1 - _SCCornea)*pow(2, -10 * dot(H, lightDir));
float k = min(1, _GLCornea + 0.545);
float v = 1 / (k* dot(viewDir, H)*dot(viewDir, H) + (1 - k));
float SpecIns = d*f*v;
float3 refDir = reflect(-viewDir, N);
float3 ref = texCUBElod(_Cubemap, float4(refDir, 0.5 - _GLCornea*0.5)).rgb;
float4 r_color = float4(c + SpecIns + Luminance(ref)* _ReflAmount, 1) * _LightColor0 * _SCCornea;
r_color.a=_AlphaVal;
return r_color;
}
ENDCG
}
}
}
更多推荐
已为社区贡献6条内容
所有评论(0)