上材质,有个新gameelement在basic主题包里记得改
This commit is contained in:
@@ -10,7 +10,7 @@ Shader "Custom/ImprovedPseudoShadow" {
|
||||
_ShadowSmoothness ("Shadow Smoothness", Range(0,1)) = 0.1
|
||||
|
||||
[Header(Lighting Mode)]
|
||||
[Toggle(USE_WORLD_LIGHT)] _UseWorldLight ("Use Fixed World Light?", Float) = 0
|
||||
_UseWorldLight ("Use Fixed World Light?", Range(0,1)) = 0
|
||||
_FakeLightDir ("Fake Light Dir (XYZ)", Vector) = (0.5, 1, 0.5, 0) // 模拟从右上方来的光
|
||||
}
|
||||
|
||||
@@ -24,9 +24,6 @@ Shader "Custom/ImprovedPseudoShadow" {
|
||||
#pragma fragment frag
|
||||
// 开启 GPU Instancing 支持
|
||||
#pragma multi_compile_instancing
|
||||
// 开启着色器变体以支持两种光照模式
|
||||
#pragma shader_feature USE_WORLD_LIGHT
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
struct appdata {
|
||||
@@ -53,6 +50,7 @@ Shader "Custom/ImprovedPseudoShadow" {
|
||||
UNITY_DEFINE_INSTANCED_PROP(float4, _FakeLightDir)
|
||||
UNITY_DEFINE_INSTANCED_PROP(float, _ShadowThreshold)
|
||||
UNITY_DEFINE_INSTANCED_PROP(float, _ShadowSmoothness)
|
||||
UNITY_DEFINE_INSTANCED_PROP(float, _UseWorldLight)
|
||||
UNITY_INSTANCING_BUFFER_END(Props)
|
||||
|
||||
v2f vert (appdata v) {
|
||||
@@ -66,23 +64,14 @@ Shader "Custom/ImprovedPseudoShadow" {
|
||||
float3 normalWorld = UnityObjectToWorldNormal(v.normal);
|
||||
float3 lightDir;
|
||||
|
||||
#ifdef USE_WORLD_LIGHT
|
||||
// 改进1:使用固定的世界空间伪光照方向
|
||||
lightDir = normalize(UNITY_ACCESS_INSTANCED_PROP(Props, _FakeLightDir).xyz);
|
||||
#else
|
||||
// 原版逻辑:使用视线方向 (Headlamp)
|
||||
// 注意:为了获得类似漫反射的效果,这里通常不需要取反,
|
||||
// 但如果要模拟“边缘光”则算法不同。这里沿用原文档的思路:面朝相机越亮。
|
||||
lightDir = normalize(WorldSpaceViewDir(v.vertex));
|
||||
#endif
|
||||
float useWorldLight = UNITY_ACCESS_INSTANCED_PROP(Props, _UseWorldLight);
|
||||
float3 fakeDir = normalize(UNITY_ACCESS_INSTANCED_PROP(Props, _FakeLightDir).xyz);
|
||||
float3 viewDir = normalize(WorldSpaceViewDir(v.vertex));
|
||||
// 用lerp实现分支
|
||||
lightDir = normalize(lerp(viewDir, fakeDir, useWorldLight));
|
||||
|
||||
// 点积计算 (-1 到 1)
|
||||
float dotProduct = dot(normalWorld, lightDir);
|
||||
|
||||
// 将点积结果保存,在片元阶段处理颜色,或者直接在这里计算
|
||||
// 保持 Vertex Lighting 的高性能
|
||||
o.lightFactor = dotProduct;
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user