游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:779

当前位置:游戏蛮牛 技术专区 教程分享

查看: 851|回复: 9

[实例教程] 实现眼镜反射环境光的效果shader

[复制链接]  [移动端链接]
5熟悉之中
647/1000
排名
4635
昨日变化
1

5

主题

169

帖子

647

积分

Rank: 5Rank: 5

UID
104455
好友
0
蛮牛币
1021
威望
0
注册时间
2015-5-30
在线时间
187 小时
最后登录
2018-3-26
QQ
发表于 2018-2-7 17:42:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
镜片实现反周围环境,可以调节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"  
}  

亮

暗

回复

使用道具 举报

7日久生情
3150/5000
排名
2225
昨日变化
7

0

主题

2101

帖子

3150

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
1
蛮牛币
2424
威望
0
注册时间
2017-7-12
在线时间
465 小时
最后登录
2018-8-17

活力之星

发表于 2018-2-7 18:46:07 | 显示全部楼层
谢谢分享

回复

使用道具 举报

排名
22664
昨日变化
9

0

主题

21

帖子

55

积分

Rank: 2Rank: 2

UID
268041
好友
0
蛮牛币
25
威望
0
注册时间
2018-2-7
在线时间
16 小时
最后登录
2018-8-8
发表于 2018-2-7 19:00:21 | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
2536/5000
排名
3503
昨日变化
1

2

主题

1780

帖子

2536

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
241666
好友
0
蛮牛币
10199
威望
0
注册时间
2017-9-6
在线时间
362 小时
最后登录
2018-6-7
发表于 2018-2-8 07:08:48 来自Mobile--- | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
2640/5000
排名
2709
昨日变化
11

0

主题

1878

帖子

2640

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185339
好友
0
蛮牛币
3844
威望
0
注册时间
2016-11-20
在线时间
268 小时
最后登录
2018-8-17
发表于 2018-2-8 09:07:05 | 显示全部楼层
谢谢分享,666666666666666
[发帖际遇]: 步行骑士 发帖时在路边捡到 1 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

7日久生情
2227/5000
排名
3084
昨日变化
13

8

主题

1105

帖子

2227

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
168159
好友
4
蛮牛币
5125
威望
0
注册时间
2016-9-12
在线时间
670 小时
最后登录
2018-8-17
发表于 2018-2-8 09:21:33 | 显示全部楼层

回复

使用道具 举报

6蛮牛粉丝
1359/1500
排名
5205
昨日变化
1

6

主题

832

帖子

1359

积分

Rank: 6Rank: 6Rank: 6

UID
236677
好友
0
蛮牛币
2226
威望
0
注册时间
2017-8-9
在线时间
271 小时
最后登录
2018-6-22
发表于 2018-2-8 10:13:44 | 显示全部楼层
感谢分享

回复

使用道具 举报

6蛮牛粉丝
1016/1500
排名
3307
昨日变化
2

1

主题

371

帖子

1016

积分

Rank: 6Rank: 6Rank: 6

UID
122160
好友
1
蛮牛币
1669
威望
0
注册时间
2015-9-10
在线时间
236 小时
最后登录
2018-8-1
发表于 2018-2-8 10:22:01 | 显示全部楼层
感谢分享

回复

使用道具 举报

5熟悉之中
737/1000
排名
3841
昨日变化
20

0

主题

207

帖子

737

积分

Rank: 5Rank: 5

UID
68040
好友
0
蛮牛币
976
威望
0
注册时间
2015-1-13
在线时间
180 小时
最后登录
2018-8-17
发表于 2018-3-1 13:33:45 | 显示全部楼层

谢谢分享

回复

使用道具 举报

5熟悉之中
548/1000
排名
7226
昨日变化
3

0

主题

272

帖子

548

积分

Rank: 5Rank: 5

UID
250350
好友
2
蛮牛币
511
威望
0
注册时间
2017-10-23
在线时间
114 小时
最后登录
2018-8-7
发表于 2018-3-12 18:38:42 | 显示全部楼层
感谢分享

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表