庄懂09课 菲涅尔,CubeMap,Matcap连连看代码

这两篇博客详细介绍了如何使用ShaderForge创建自定义着色器,分别实现了基于法线贴图的球形环境光映射和立方体贴图的环境光与菲涅尔效应。通过调整参数,可以控制环境镜面反射的强度和质量,为3D模型添加更丰富的光照效果。
摘要由CSDN通过智能技术生成

庄懂老师https://space.bilibili.com/6373917?spm_id_from=333.788.b_765f7570696e666f.1第九课

Shader "Shader Forge/code Matcap" {
    Properties {
         _NormalMap ("法线贴图", 2D) = "bump" {}
        _matcap ("matcap", 2D) = "grey" {}
        _fransnal ("菲涅尔次幂", Range(0, 5)) = 4.223301
        _EnvSpecInt ("环境镜面反射强度次幂", Range(0, 1)) = 0
    }
    SubShader {
        Tags {
            "RenderType"="Opaque"
        }
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma target 3.0
            
            uniform sampler2D _NormalMap;
            uniform sampler2D _matcap;
            uniform float _fransnal;
            uniform float _EnvSpecInt;

            struct VertexInput {
                float4 vertex : POSITION; 
                float3 normal : NORMAL;
                float4 tangent: TANGENT;
                float2 uv0    : TEXCOORD0;
           };
            struct VertexOutput {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
                float3 tdirWS : TEXCOORD1;
                float3 ndirWS : TEXCOORD2;
                float3 bdirWS : TEXCOORD3;
                float3 posWS : TEXCOORD4;

            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.pos = UnityObjectToClipPos( v.vertex );
                o.posWS = mul(unity_ObjectToWorld, v.vertex); 
                o.uv0 = v.uv0;
                o.ndirWS = UnityObjectToWorldNormal(v.normal);
                o.tdirWS = normalize( mul( unity_ObjectToWorld, float4( v.tangent.xyz, 0.0 ) ).xyz );
                o.bdirWS = normalize(cross(o.ndirWS, o.tdirWS) * v.tangent.w);
                return o;
            }
            float4 frag(VertexOutput i) : COLOR {
                //准备向量
                float3 ndirTS = UnpackNormal(tex2D(_NormalMap, i.uv0)).rgb;// 采样法线纹理并解码 切线空间nDir
                float3x3 TBN = float3x3(i.tdirWS,i.bdirWS,i.ndirWS); // 构建TBN矩阵
                float3 ndirWS = normalize(mul(ndirTS,TBN));
                float3 ndirVS = mul(UNITY_MATRIX_V,float4(ndirWS,0.0));
                float3 vDirWS = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);//Vdir
                //中间量准备
                float2 matcapUV = ndirVS.rg * 0.5 + 0.5;
                float ndotv    = dot(ndirWS,vDirWS);
                //光照模型
                float3 matcap = tex2D(_matcap,matcapUV);
                float fresnel = pow(1-ndotv,_fransnal);
                float3 envSpecLighting = matcap *fresnel*_EnvSpecInt;
                return float4(envSpecLighting,1.0);
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

Shader "Shader Forge/CupeMap" {
    Properties {
        _Cubemap ("环境球", Cube) = "_Skybox" {}
        _Normalmap ("法线贴图", 2D) = "bump" {}
        _Cubemapmip ("环境球MIP", Range(0, 7)) = 4.078261
        _FrasnalPws ("菲涅尔次幂", Range(0, 10)) = 3.913043
        _EnvSpecInt ("环境镜面反射强度", Range(0, 5)) = 0.5913044
    }
    SubShader {
        Tags {
            "RenderType"="Opaque"
        }
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma target 3.0


            uniform samplerCUBE _Cubemap;
            uniform sampler2D  _Normalmap;
            uniform float _Cubemapmip;
            uniform float _FrasnalPws;
            uniform float _EnvSpecInt;


            struct VertexInput {
                float4 vertex : POSITION; 
                float3 normal : NORMAL;
                float4 tangent: TANGENT;
                float2 uv0    : TEXCOORD0;

            };
            struct VertexOutput {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
                float3 tdirWS : TEXCOORD1;
                float3 ndirWS : TEXCOORD2;
                float3 bdirWS : TEXCOORD3;
                float3 posWS : TEXCOORD4;

            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.pos = UnityObjectToClipPos( v.vertex );
                o.posWS = mul(unity_ObjectToWorld, v.vertex); 
                o.uv0 = v.uv0;
                o.ndirWS = UnityObjectToWorldNormal(v.normal);
                o.tdirWS = normalize( mul( unity_ObjectToWorld, float4( v.tangent.xyz, 0.0 ) ).xyz );
                o.bdirWS = normalize(cross(o.ndirWS, o.tdirWS) * v.tangent.w);
                return o;
            }
            float4 frag(VertexOutput i) : COLOR {
                //准备向量
                float3 ndirTS = UnpackNormal(tex2D(_Normalmap, i.uv0)).rgb;// 采样法线纹理并解码 切线空间nDir
                float3x3 TBN = float3x3(i.tdirWS,i.bdirWS,i.ndirWS); // 构建TBN矩阵
                float3 ndirWS = normalize(mul(ndirTS,TBN));
                float3 vDirWS = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);//Vdir
                float3 vrDirWS = reflect(-vDirWS,ndirWS);
                //中间量准备
                float ndotv    = dot(ndirWS,vDirWS);
                //光照模型
                float3 Cubemap=texCUBElod(_Cubemap,float4(vrDirWS,_Cubemapmip));
                float fresnel = pow(max(0,1-ndotv),_FrasnalPws);
                float3 envSpecLighting =Cubemap*fresnel*_EnvSpecInt;

                return float4(envSpecLighting,1.0);
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值