庄懂老师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