庄懂07课 OldschoolPlus代码 三色环境光(环境漫反射)

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

Shader "Unlit/3C CODE" {
    Properties {
        _Occlusion   ("AO图",2d)           = "white"{}
        _EnvUpCol    ("环境上部颜色",color) = (1.0,1.0,1.0,1.0)
        _EnvSideCol  ("环境侧边颜色",color) = (0.5,0.5,0.5,0.5)
        _EnvDownCol  ("环境下部颜色",color) = (0.0,0.0,0.0,0.0)
    }
    SubShader {
        Tags {
            "RenderType"="Opaque"
        }
        LOD 100
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma multi_compile_fog
            #pragma target 3.0
            //输入参数
            uniform float3 _EnvUpCol;
            uniform float3 _EnvSideCol;
            uniform float3 _EnvDownCol;
            uniform sampler2D _Occlusion;

            //输入结构
            struct VertexInput {
                float4 vertex : POSITION;//输入顶点
                float3 normal : NORMAL; //输入模型法线
                float2 uv0 : TEXCOORD0;//输入UV 第0通道 共4个
            };
            //输出结构
            struct VertexOutput {
                float4 pos : SV_POSITION;//由模型顶点信息换算来的屏幕空间法线信息
                float3 nDirWS : TEXCOORD0;//由模型法线信息换算来的世界空间法线信息
                float2 uv : TEXCOORD1;//追加UV信息用语像素Shader采样贴图
            };
            //输入结构>>>顶点Shader>>>输出结构
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.pos = UnityObjectToClipPos( v.vertex );        
                o.nDirWS = UnityObjectToWorldNormal(v.normal);        //把模型法线转换成世界空间法线信息
                o.uv = v.uv0;//字面意思
                return o;
            }
            //输出结构>>>像素
            float4 frag(VertexOutput i) : COLOR {
                //准备
                float3 nDir = i.nDirWS;//获取法线nDir
                //计算
                float upmask = max(0.0,nDir.g);
                float downmask = max(0.0,-nDir.g);
                float sidemask = 1-upmask-downmask;
                //混合环境色
                float3 EnvCol = _EnvUpCol*upmask+ _EnvSideCol*downmask+_EnvDownCol*sidemask;
                //采样ao
                float Occlusion = tex2D(_Occlusion,i.uv);   
                //计算光照模型
                float3 EnvLighting =EnvCol*Occlusion;
                //返回最终颜色 
                return float4(EnvLighting,1.0);
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
    CustomEditor "ShaderForgeMaterialInspector"
}

三色环境光代码

Shader "Unlit/shadow"
{
    Properties
    {
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        Pass
        {
		    Name"FORWARD"
		    Tags { "LightMode" = "ForwardBase" }
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
			#include "AutoLight.cginc"//使用Unity投影必须包含这俩库文件
		    #include "Lighting.cginc"//同上
            #pragma multi_compile_fwdbase_fullshadows//同上

            struct VertexInput
            {
                float4 vertex : POSITION;
            };

            struct VertexOutput
            {
                float4 pos : SV_POSITION;
				LIGHTING_COORDS(0,1)//投影用坐标信息
                
            };

           VertexOutput vert (VertexInput v)
            {
                VertexOutput o = (VertexOutput)0;
                o.pos = UnityObjectToClipPos(v.vertex);
                TRANSFER_VERTEX_TO_FRAGMENT(o)//unity封装
                return o;
            }

			float4 frag(VertexOutput i) : COLOR
			{
				float shadow = LIGHT_ATTENUATION(i);//同封装,取出投影
                return float4(shadow, shadow, shadow,1.0);
            }
            ENDCG
        }
    }
		FallBack "Diffuse"
}

shadow代码‘;连连看不展示了只需要一个节点

OldschoolPlus连连看

Shader "Unlit/oldschoolPlus CODE" {
    Properties {
        _LightPower  ("高光集中度",range(0,60)) =30
        _BasePower   ("基础颜色",color)    = (1.0,1.0,1.0,1.0)
        _LightCol    ("光源颜色",color)    =  (0.5,0.5,0.5,0.5)
        _Occlusion   ("AO图",2d)           = "white"{}
        _EnvUpCol    ("环境上部颜色",color) = (1.0,1.0,1.0,1.0)
        _EnvSideCol  ("环境侧边颜色",color) = (0.5,0.5,0.5,0.5)
        _EnvDownCol  ("环境下部颜色",color) = (0.0,0.0,0.0,0.0)
    }
    SubShader {
        Tags {
            "RenderType"="Opaque"
        }
        LOD 100
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "AutoLight.cginc"
            #include "Lighting.cginc"  
            #pragma multi_compile_fwdbase_fullshadows
            #pragma multi_compile_fog
            #pragma target 3.0
            //输入参数
            uniform float _LightPower;
            uniform float3 _BasePower;
            uniform float3 _LightCol;
            uniform float3 _EnvUpCol;
            uniform float3 _EnvSideCol;
            uniform float3 _EnvDownCol;
            uniform sampler2D _Occlusion;

            //输入结构
            struct VertexInput {
                float4 vertex : POSITION;//输入顶点
                float3 normal : NORMAL; //输入模型法线
                float2 uv0 : TEXCOORD0;//输入UV 第0通道 共4个
            };
            //输出结构
            struct VertexOutput {
                float4 pos : SV_POSITION;//由模型顶点信息换算来的屏幕空间法线信息
                float4 posWS : TEXCOORD1;//由模型顶点信息换算的世界顶点信息(vDir =归一化(摄像机位置- posWS))
                float3 nDirWS : TEXCOORD0;//由模型法线信息换算来的世界空间法线信息
                float2 uv : TEXCOORD2;//追加UV信息用语像素Shader采样贴图
                LIGHTING_COORDS(0,5)//投影坐标信息
            };
            //输入结构>>>顶点Shader>>>输出结构
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;//新建输出结构
                o.pos = UnityObjectToClipPos(v.vertex);     //少了
                o.posWS = mul(unity_ObjectToWorld, v.vertex);        
                o.nDirWS = UnityObjectToWorldNormal(v.normal);        //把模型法线转换成世界空间法线信息
                o.uv = v.uv0;//字面意思
                TRANSFER_VERTEX_TO_FRAGMENT(o)//UNITY阴影。已封装
                return o;
            }
            //输出结构>>>像素
            float4 frag(VertexOutput i) : COLOR {
                //准备
                float shadow = LIGHT_ATTENUATION(i);//UNITY阴影。已封装
                float3 nDir = i.nDirWS;//获取法线nDir
                float3 lDir = _WorldSpaceLightPos0.xyz;//lDir
                float3 vDir = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);//Vdir
                float3 rDir =reflect(-lDir,nDir);//光的反射
                float upmask = max(0.0,nDir.g);
                float downmask = max(0.0,-nDir.g);
                float sidemask = 1-upmask-downmask;
                //计算点积
                float lambert = max(0,dot(nDir,lDir))*_BasePower;
                float  Phone  = pow(max(0.0,dot(rDir,vDir)),_LightPower);
                float3 oldschool =(lambert+Phone)*_LightCol*shadow;
                float3 EnvCol = _EnvUpCol*upmask+ _EnvSideCol*downmask+_EnvDownCol*sidemask;
                float3 finalCol =EnvCol+oldschool;
                
                return float4(finalCol, 1.0);
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

代码(下方为老师代码

自己模型贴图+AO

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值