1. 实现效果
lambert:
halfLambert:
2. 代码块
Shader "Unlit/diffusion"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Color("Base Color", color) = (1.0, 1.0, 1.0, 1.0)[Toggle(_LAMBERT_LIGHTS)]_DiffusionLights0("DiffusionModle = Lambert", float)=1.0[Toggle(_HALFLAMBERT_LIGHTS)]_DiffusionLights1("DiffusionModle = HalfLambert", float)=0.0}SubShader{Tags{"RenderPipeLine" = "UniversalRenderPipeline""RenderType" = "Opaque"}Pass{Tags{"LightMode" = "UniversalForward"}HLSLPROGRAM#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"#pragma vertex vert#pragma fragment frag#pragma shader_feature _LAMBERT_LIGHTS#pragma shader_feature _HALFLAMBERT_LIGHTS//定义属性CBUFFER_START(UnityPerMaterial)uniform float3 _Color;CBUFFER_ENDuniform TEXTURE2D(_MainTex);uniform SAMPLER(sampler_MainTex);//顶点着色器输入struct VertexInput{float4 positionOS : POSITION;float3 normalOS : NORMAL;float2 uv : TEXCOORD0;};//顶点着色器输出struct VertexOutput{float4 positionCS : SV_POSITION;float3 normalWS : TEXCOORD0;float2 uv0 : TEXCOORD1;float3 positionWS : TEXCOORD2;};struct objectData{Light light;float3 positionWS;float3 nDirWS;float2 uv;};half3 CalculateLight(objectData od){//获取贴图half3 var_mainTex = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, od.uv);//获取光源方向信息float3 lDir = od.light.direction;//获取法线信息float3 nDirWS = od.nDirWS;//准备点乘信息float ndotl = dot(nDirWS, lDir);float diffusion = 0.0;//光照模型#if _LAMBERT_LIGHTSdiffusion = max(0.0, ndotl); //lanbert#elif _HALFLAMBERT_LIGHTSdiffusion = ndotl * 0.5 + 0.5; //halflambert#endifhalf3 finalCol = var_mainTex * diffusion * od.light.color * _Color;return finalCol;}//顶点着色VertexOutput vert(VertexInput v){VertexOutput o;o.positionCS = TransformObjectToHClip(v.positionOS.xyz);o.normalWS = TransformObjectToWorldNormal(v.normalOS);o.positionWS = TransformObjectToWorld(v.positionOS);o.uv0 = v.uv;return o;}//像素着色器half4 frag(VertexOutput i):SV_TARGET{Light light = GetMainLight();//构建结构体接受数据objectData ObjectData;ObjectData.light = light;ObjectData.nDirWS = i.normalWS;ObjectData.uv = i.uv0;//调用函数计算主光源half3 finalCol = CalculateLight(ObjectData);//计算次光源//获取场景中灯源数量int lightsCount = GetAdditionalLightsCount();for(int t = 0; t < lightsCount; t++){//调用不同光照Light light = GetAdditionalLight(t, i.positionWS);objectData AdditionalObjectData;AdditionalObjectData.light = light;AdditionalObjectData.nDirWS = i.normalWS;AdditionalObjectData.uv = i.uv0;finalCol += CalculateLight(AdditionalObjectData);}return half4(finalCol, 1.0);}ENDHLSL}}
}
3. 切换光照模型
勾选不同选项即可