庄懂老师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出现问题的话可以删除