我的第一个光照模型(继续改进)

Shader "Custom/FirstMode"

{

    Properties

    {

        _MainTex ("Albedo (RGB)", 2D) = "white" {}

        _BaseColor ("BaseColor", Color) = (1,1,1,1)

        _NormalTex("NormalTex",2D) = "bump"{}

        _Gloss("Gloss",Range(1,100)) = 1

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

    }

    SubShader

    {

        Tags { 

            "RenderPipeline"="UniversalRenderPipline"

            "RenderType"="Opaque" 

        }

        HLSLINCLUDE

        #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

        #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

        

        CBUFFER_START(UnityMaterial)

        float4 _MainTex_ST;

        float4 _BaseColor;

        float _Gloss;

        float _ScapularSize;

        CBUFFER_END




        //提前采样好贴图

        TEXTURE2D (_MainTex);

        SAMPLER(sampler_MainTex);

        float4 MainTex (float2 uv)

        {

            return SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,uv);

        }



        TEXTURE2D(_NormalTex);

        SAMPLER(sampler_NormalTex);

        float3 NormalTex(float2 uv)

        {

            return UnpackNormal(SAMPLE_TEXTURE2D(_NormalTex,sampler_NormalTex,uv));

        }







        struct appdata

        {

            float4 Pos:POSITION;

            float4 normal:NORMAL;

            float2 uv : TEXCOORD0;

            float4 tangent:TANGENT;

        };



        struct v2f

        {

            float4 Pos:SV_POSITION;

            float2 uv:TEXCOORD0;

            float4 tangent:TANGENT;

            float4 Btangent:TEXCOORD1;

            float4 normal:NORMAL;

            float3 PosWS:TEXCOORD2;

        };




        ENDHLSL

        pass

        {



            HLSLPROGRAM

            #pragma vertex VERT

            #pragma fragment FRAG

            #pragma multi_compile _ _MAIN_LIGHT_SHADOWS

            #pragma multi_compile _ _MAIN_LIGHT_SHADOW_CASCADE

            #pragma multi_compile _ _SHADOWS_SOFT //柔化阴影




            v2f VERT( appdata i)

            {

                v2f o;

                o.Pos = TransformObjectToHClip(i.Pos.xyz);

                o.uv = TRANSFORM_TEX(i.uv, _MainTex);

                o.PosWS = TransformObjectToWorld(i.Pos);



                o.normal.xyz = normalize(TransformObjectToWorldNormal(i.normal.xyz));

                o.tangent.xyz = normalize(TransformObjectToWorld(i.tangent.xyz));

                o.Btangent.xyz= cross(o.normal.xyz,o.tangent.xyz) * i.tangent.w;

                //把世界空间顶点坐标塞到TBN的w通道里

                // float3 worldPos = TransformObjectToWorld(i.Pos.xyz);

                // o.tangent.w = worldPos.x;

                // o.Btangent.w = worldPos.y;

                // o.normal.w = worldPos.z;

                o.PosWS = TransformObjectToWorld(i.Pos.xyz);

                return o;

            }



            float4 FRAG(v2f i):SV_TARGET

            {

                //计算带阴影衰减的主光源

                Light light = GetMainLight(TransformWorldToShadowCoord(i.PosWS));

                float3 lightColor = light.color;

                //引入采样好的贴图

                float4 Var_MainTex =  MainTex(i.uv);

                float3 Var_NormalTex = NormalTex(i.uv);

                Var_NormalTex = float3(lerp(-Var_NormalTex.x,Var_NormalTex.x,dot(i.normal,light.direction)),lerp(-Var_NormalTex.y,Var_NormalTex.y,dot(i.normal,light.direction)),Var_NormalTex.z);



                



                //准备向量



                //TBN矩阵计算

                float3x3 TBN = float3x3(i.tangent.xyz,i.Btangent.xyz,i.normal.xyz);

                //利用TBN矩阵变换法线空间

                float3 nDirWS = normalize(mul(float3(Var_NormalTex.x,Var_NormalTex.y,1),TBN));

                float3 lDirWS = normalize(light.direction);

                float3 vDirWS = normalize(_WorldSpaceCameraPos.xyz - i.PosWS);

                float3 lrDirWS = reflect(-lDirWS,nDirWS);

                //获取阴影衰减

                float Shadow = light.shadowAttenuation;

                Shadow *=  max(0,dot(i.normal,lDirWS));

                //高光

                float3 Scapular = pow(max(0,dot(vDirWS,lrDirWS)),_Gloss) * Var_MainTex * _ScapularSize;

                //获取环境光颜色

                float3 ambient =half3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w);

               

                //计算模型的光照数据

                float HalfLambert =saturate (dot(nDirWS,lDirWS) *0.5 +0.6) ;

               

                float4 Albedo = Var_MainTex * _BaseColor;



                 //叠加环境光颜色进阴影里

                float3 finalRGB = lerp(Albedo * ambient , Albedo * light.color,Shadow);

                return float4(finalRGB.rgb * Albedo * HalfLambert + Scapular,1);



                //return Scapular.rgbb;



            }



            ENDHLSL 

        }

        UsePass "Universal Render Pipeline/Lit/ShadowCaster"

    }

    

}


 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值