上材质,有个新gameelement在basic主题包里记得改

This commit is contained in:
2025-11-23 14:13:18 +08:00
parent 117352182b
commit bcd2c82142
24 changed files with 17258 additions and 16609 deletions

View File

@@ -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;
}