上图
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:为了避免虹膜在莫个光照角度产生平板光,需要把模型虹膜部分微微往下凹
上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
	}
	}
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐