Unity 实现眼镜反射环境光的效果

镜片实现反周围环境,可以调节cubemap_slider改变cubemap的亮度,调节_alpha_slider改变镜片的透明度,自由实现近视镜和墨镜的效果

shader给大家贴出来 :

Shader "Custom/Glass_Mirror" {

Properties {

_cubemap ("cubemap", Cube) = "_Skybox" {}

_cubemap_slider ("cubemap_slider", Range(0, 1)) = 1

_color ("color", Color) = (0.5,0.5,0.5,1)

_texture_diffuse ("texture_diffuse", 2D) = "white" {}

_alpha_slider ("_alpha_slider", Range(0, 1)) = 1

}

SubShader {

Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}

Blend SrcAlpha OneMinusSrcAlpha

Pass { 

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#define UNITY_PASS_FORWARDBASE

#include "UnityCG.cginc"

#include "AutoLight.cginc"

#include "UnityPBSLighting.cginc"

#include "UnityStandardBRDF.cginc"

#pragma multi_compile_fwdbase_fullshadows

#pragma target 3.0

uniform samplerCUBE _cubemap;

uniform float _cubemap_slider;

uniform float4 _color;

uniform sampler2D _texture_diffuse; uniform float4 _texture_diffuse_ST;

uniform float _alpha_slider;

struct VertexInput {

float4 vertex : POSITION;

float3 normal : NORMAL;

float2 texcoord0 : TEXCOORD0;

};

struct VertexOutput {

float4 pos : SV_POSITION;

float2 uv0 : TEXCOORD0;

float4 posWorld : TEXCOORD1;

float3 normalDir : TEXCOORD2;

LIGHTING_COORDS(3,4)

UNITY_FOG_COORDS(5)

};

VertexOutput vert (VertexInput v) {

VertexOutput o = (VertexOutput)0;

o.uv0 = v.texcoord0;

o.normalDir = UnityObjectToWorldNormal(v.normal);

o.posWorld = mul(unity_ObjectToWorld, v.vertex);

float3 lightColor = _LightColor0.rgb;

o.pos = UnityObjectToClipPos(v.vertex );

UNITY_TRANSFER_FOG(o,o.pos);

TRANSFER_VERTEX_TO_FRAGMENT(o)

return o;

}

float4 frag(VertexOutput i) : COLOR {

i.normalDir = normalize(i.normalDir);

float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);

float3 normalDirection = i.normalDir;

float3 viewReflectDirection = reflect( -viewDirection, normalDirection );

float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);

float3 lightColor = _LightColor0.rgb;

float3 halfDirection = normalize(viewDirection+lightDirection);

////// Lighting:

float attenuation = LIGHT_ATTENUATION(i);

float3 attenColor = attenuation * _LightColor0.rgb;

////

float Pi = 3.141592654;

float InvPi = 0.31830988618;

/////

///////// Gloss:

float gloss = 0.8;

float specPow = exp2( gloss * 10.0+1.0);

/////// GI Data:

UnityLight light;

#ifdef LIGHTMAP_OFF

light.color = lightColor;

light.dir = lightDirection;

light.ndotl = LambertTerm (normalDirection, light.dir);

#else

light.color = half3(0.f, 0.f, 0.f);

light.ndotl = 0.0f;

light.dir = half3(0.f, 0.f, 0.f);

#endif

UnityGIInput d;

d.light = light;

d.worldPos = i.posWorld.xyz;

d.worldViewDir = viewDirection;

d.atten = attenuation;

d.boxMax[0] = unity_SpecCube0_BoxMax;

d.boxMin[0] = unity_SpecCube0_BoxMin;

d.probePosition[0] = unity_SpecCube0_ProbePosition;

d.probeHDR[0] = unity_SpecCube0_HDR;

d.boxMax[1] = unity_SpecCube1_BoxMax;

d.boxMin[1] = unity_SpecCube1_BoxMin;

d.probePosition[1] = unity_SpecCube1_ProbePosition;

d.probeHDR[1] = unity_SpecCube1_HDR;

Unity_GlossyEnvironmentData ugls_en_data;

ugls_en_data.roughness = 1.0 - gloss;

ugls_en_data.reflUVW = viewReflectDirection;

UnityGI gi = UnityGlobalIllumination(d, 1, normalDirection, ugls_en_data );

lightDirection = gi.light.dir;

lightColor = gi.light.color;

////// Specular:

float NdotL = max(0, dot( normalDirection, lightDirection ));

float LdotH = max(0.0,dot(lightDirection, halfDirection));

float3 specularColor = 0.0;

float specularMonochrome;

float node_5610 = 0.2;

float3 diffuseColor = float3(node_5610,node_5610,node_5610); // Need this for specular when using metallic

diffuseColor = DiffuseAndSpecularFromMetallic( diffuseColor, specularColor, specularColor, specularMonochrome );

specularMonochrome = 1.0-specularMonochrome;

float NdotV = max(0.0,dot( normalDirection, viewDirection ));

float NdotH = max(0.0,dot( normalDirection, halfDirection ));

float VdotH = max(0.0,dot( viewDirection, halfDirection ));

float visTerm = SmithJointGGXVisibilityTerm( NdotL, NdotV, 1.0-gloss );

float normTerm = max(0.0, GGXTerm(NdotH, 1.0-gloss));

float specularPBL = (NdotL*visTerm*normTerm) * (UNITY_PI / 4);

if (IsGammaSpace())

specularPBL = sqrt(max(1e-4h, specularPBL));

specularPBL = max(0, specularPBL * NdotL);

float3 directSpecular = (floor(attenuation) * _LightColor0.rgb)*specularPBL*FresnelTerm(specularColor, LdotH);

half grazingTerm = saturate( gloss + specularMonochrome );

float3 indirectSpecular = (gi.indirect.specular);

indirectSpecular *= FresnelLerp (specularColor, grazingTerm, NdotV);

float3 specular = (directSpecular + indirectSpecular);

/////// Diffuse:

//float NdotL = max(0.0,dot( normalDirection, lightDirection ));

float3 directDiffuse = max( 0.0, NdotL) * attenColor;

float3 indirectDiffuse = float3(0,0,0);

indirectDiffuse *= UNITY_LIGHTMODEL_AMBIENT.rgb; // Ambient Light

float3 node_307 = (texCUBE(_cubemap,viewReflectDirection).rgb*_cubemap_slider);

//indirectDiffuse += float3(node_307,node_307,node_307); // Diffuse Ambient Light

indirectDiffuse += node_307;

float4 _texture_diffuse_var = tex2D(_texture_diffuse,i.uv0);

diffuseColor = (_texture_diffuse_var.rgb);

float3 diffuse = (directDiffuse + indirectDiffuse) * diffuseColor;

//float3 diffuse = node_307 + diffuseColor;

/// Final Color:

float3 finalColor = diffuse + specular;

//float3 finalColor = diffuseColor;

fixed4 finalRGBA = fixed4(finalColor,_alpha_slider);

UNITY_APPLY_FOG(i.fogCoord, finalRGBA);

return finalRGBA;

}

ENDCG

}

}

FallBack "Diffuse"

}

暗.jpg (94.11 KB, 下载次数: 0)

亮.jpg (101.17 KB, 下载次数: 0)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容