- 引入 UnityGameFramework
- 使用 Luban 替代原来的 UGF 的数据表
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
Shader "Custom/SimpleInstancedFlash"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
_BaseColor ("Base Color", Color) = (1,1,1,1)
|
||||
_FlashColor ("Flash Color", Color) = (1,1,1,1) // 闪白颜色
|
||||
_FlashAmount ("Flash Amount", Range(0, 1)) = 0 // 0=不闪, 1=全闪
|
||||
}
|
||||
|
||||
SubShader
|
||||
{
|
||||
Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" "Queue"="Geometry+10" }
|
||||
LOD 100
|
||||
|
||||
Pass
|
||||
{
|
||||
Name "ForwardLit"
|
||||
Tags { "LightMode"="UniversalForward" }
|
||||
|
||||
HLSLPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
|
||||
// 开启 GPU Instancing 必须的宏
|
||||
#pragma multi_compile_instancing
|
||||
|
||||
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
||||
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
|
||||
|
||||
struct Attributes
|
||||
{
|
||||
float4 positionOS : POSITION;
|
||||
float3 normalOS : NORMAL;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID // 1. 输入结构体必须包含 Instance ID
|
||||
};
|
||||
|
||||
struct Varyings
|
||||
{
|
||||
float4 positionCS : SV_POSITION;
|
||||
float3 normalWS : TEXCOORD0;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID // 2. 输出结构体必须包含 Instance ID
|
||||
};
|
||||
|
||||
// 3. 定义 Instancing 缓冲区 (这里定义的数据每个物体都可以不同)
|
||||
UNITY_INSTANCING_BUFFER_START(Props)
|
||||
UNITY_DEFINE_INSTANCED_PROP(float4, _BaseColor)
|
||||
UNITY_DEFINE_INSTANCED_PROP(float4, _FlashColor)
|
||||
UNITY_DEFINE_INSTANCED_PROP(float, _FlashAmount)
|
||||
UNITY_INSTANCING_BUFFER_END(Props)
|
||||
|
||||
Varyings vert(Attributes input)
|
||||
{
|
||||
Varyings output;
|
||||
|
||||
// 4. 设置 Instance ID
|
||||
UNITY_SETUP_INSTANCE_ID(input);
|
||||
UNITY_TRANSFER_INSTANCE_ID(input, output);
|
||||
|
||||
VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
|
||||
output.positionCS = vertexInput.positionCS;
|
||||
|
||||
VertexNormalInputs normalInput = GetVertexNormalInputs(input.normalOS, float4(0,0,0,0));
|
||||
output.normalWS = normalInput.normalWS;
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
half4 frag(Varyings input) : SV_Target
|
||||
{
|
||||
// 5. 片元着色器也要 Setup Instance ID
|
||||
UNITY_SETUP_INSTANCE_ID(input);
|
||||
|
||||
// 6. 使用宏读取属性 (代替直接写 _BaseColor)
|
||||
float4 baseColor = UNITY_ACCESS_INSTANCED_PROP(Props, _BaseColor);
|
||||
float4 flashColor = UNITY_ACCESS_INSTANCED_PROP(Props, _FlashColor);
|
||||
float flashAmount = UNITY_ACCESS_INSTANCED_PROP(Props, _FlashAmount);
|
||||
|
||||
// 简单光照计算 (Lambert)
|
||||
Light mainLight = GetMainLight();
|
||||
float NdotL = saturate(dot(input.normalWS, mainLight.direction));
|
||||
float3 lighting = baseColor.rgb * (mainLight.color * NdotL + unity_AmbientSky.rgb); // 加上环境光防止背光全黑
|
||||
|
||||
// 混合闪白效果
|
||||
float3 finalColor = lerp(lighting, flashColor.rgb, flashAmount);
|
||||
|
||||
return float4(finalColor, baseColor.a);
|
||||
}
|
||||
ENDHLSL
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user