庄懂10课 OldSchoolPro连连看代码

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

自己连的太乱所以直接用了老师的PPT

 代码

Shader "Shader Forge/oldschoolPro" {
    Properties {
    [Header(Texture)]
    _MainTex  ("RGB:基础颜色 A:环境遮罩",2D) = "white"{}//AO放在贴图里
    _NormalTex ("RGB:法线贴图",2D)            = "bump"{}
    _SpecTex  ("RGB:高光颜色 A:高光次幂",2D)  = "gery"{}//A:高光次幂
    _EmitTex  ("RGB:自发光",2D)                ="black"{}
    _Cubemap  ("RGB:环境贴图",cube)            ="skybox"{} 
    [Header(Diffuse)]
    _MainCol    ("基础颜色",color)         =(0.5,0.5,0.5,1.0)
    _EnvDiffInt ("环境反射强度",range(0,1))=0.2
    _EnvUpCol   ("环境天顶颜色",color)     =(1,1,1,1)
    _EnvDownCol ("环境地表颜色",color)     =(0.5,0.5,0.5,1.0)
    _EnvSideCol ("环境水平颜色",color)     =(0,0,0,0)
    [Header(Specular)]
    _SpecPow    ("高光次幂",Range(1,90))  =30
    _EnvSpecInt ("环境镜面反射强度",Range(0,5))=0.2
    _FransnalPow("菲涅尔次幂",Range(0,5))  =1
    _CubemapMip("环境球Mip",Range(0,7)) =1
    [Header(Emission)]
    _EmitInt    ("自发光强度",Range(1,10))  =1



      
    }
    SubShader {
        Tags {
            "RenderType"="Opaque"
        }
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            //包含文件
            #include "Lighting.cginc"
			#include "AutoLight.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma target 3.0
            //Texture
          	uniform sampler2D _MainTex;
			uniform sampler2D _NormalTex;
			uniform sampler2D _SpecTex;
			uniform sampler2D _EmitTex;
			uniform samplerCUBE _Cubemap;
            //Diffuse
			uniform float3 _MainCol;
			uniform float3 _EnvUpCol;
			uniform float3 _EnvSideCol;
			uniform float3 _EnvDownCol;
			uniform float3 _EnvDiffInt;
            //Specular
			uniform float _SpecPow;
			uniform float _EnvSpecInt;
			uniform float _FransnalPow;
			uniform float _CubemapMip;
            //Emission
			uniform float _EmitInt;


            struct VertexInput {
                float4 vertex : POSITION;  //模型顶点信息
                float2 uv0    :TEXCOORD0;  //UV
                float4 normal :NORMAL; //法线
                float4 tangent:TANGENT;//切线
                 };
            struct VertexOutput 
                {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
                float4 posWS:TEXCOORD1;
                float3 nDirWS:TEXCOORD2;
                float3 tDirWS:TEXCOORD3;
                float3 bDirWS:TEXCOORD4;
                LIGHTING_COORDS(5,6)
                };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.pos = UnityObjectToClipPos( v.vertex );
                o.uv0 =v.uv0;
                o.posWS =mul(unity_ObjectToWorld,v.vertex);
                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);
                TRANSFER_VERTEX_TO_FRAGMENT(o)//投影
                return o;
            }
            float4 frag(VertexOutput i) : COLOR {
                //向量准备
                float3 nDirTS =UnpackNormal(tex2D(_NormalTex,i.uv0)).rgb;
                float3x3 TBN  =float3x3(i.tDirWS,i.bDirWS,i.nDirWS);
                float3 nDirWS = normalize(mul(nDirTS, TBN));
                float3 vDirWS = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);
                float3 vrDirWS =(-vDirWS,nDirWS);
                float3 lDirWS =_WorldSpaceLightPos0.xyz;
                float3 lrDirWS=reflect(-lDirWS,nDirWS);
                //中间量准备
                float ndotl = dot(nDirWS,lDirWS);
                float vdotr = dot(vDirWS,lrDirWS);
                float vdotn = dot(vDirWS,nDirWS);
                //纹理采样
                float4 var_MainTex=tex2D(_MainTex,i.uv0);
                float4 var_SpecTex=tex2D(_SpecTex,i.uv0);
                float3 var_EmitTex = tex2D(_EmitTex, i.uv0).rgb;
                float CubemapMip=lerp(_CubemapMip,1,var_SpecTex.a);
                float3 var_Cubemap = texCUBElod(_Cubemap,float4(vrDirWS,CubemapMip)).rgb;
                //光照模型
                     //光源漫反射
                float3 baseCol =var_MainTex.rgb*_MainCol;
                float lambert = max(0.0,ndotl);
                     //光源镜面反射
                float specCol = var_SpecTex.rgb;
                float specPow =lerp(1,_SpecPow,var_SpecTex.a);
                float phone =pow(max(0,vdotr),specPow);    
                     //光源反射混合
                float shadow = LIGHT_ATTENUATION(i);
                float3 dirLighting =(baseCol*lambert+specCol*phone)*_LightColor0*shadow;
                     //环境漫反射
                float upMask  =max(0,nDirWS.g);
                float downMask=max(0,-nDirWS.g);
                float sideMask=1-upMask-downMask;
                float3 envCol =_EnvUpCol*upMask+_EnvDownCol*downMask+sideMask*_EnvSideCol;
                float3 envDiff =baseCol*envCol*_EnvDiffInt;
                     //环境镜面反射
                float fresnel =pow(max(0,1-vdotn),_FransnalPow);
                float3 envSpec=var_Cubemap*fresnel*_EnvSpecInt;
                     //环境反射混合
                float occlusion =var_MainTex.a;
                float3 envLighting =(envDiff+envSpec)*occlusion;
                    //自发光
                float3 emission =var_EmitTex*_EmitInt;
                     //最终混合
                float3 finalRGB =dirLighting+envLighting+emission;
               return  float4(finalRGB,1);
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

环境漫反射int出现问题的话可以删除 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值