ClientServer/Client/Assets/GPUInstancer/Shaders/Billboard/BillboardNormalBake_GPUI.shader

91 lines
2.8 KiB
Plaintext
Raw Normal View History

2025-09-06 17:17:39 +04:00
Shader "Hidden/GPUInstancer/Billboard/NormalBake"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_BumpMap ("Normal Map", 2D) = "bump" {}
_Cutoff("Cutoff" , Range(0,1)) = 0.3
_GPUIBillboardCutoffOverride("Cutoff Override", Range(0, 1)) = 0.0
_IsLinearSpace("Add Gama Correction", Float) = 0.0
}
SubShader
{
Cull Off
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "UnityStandardUtils.cginc"
#include "../Include/GPUIBillboardInclude.cginc"
sampler2D _BumpMap;
sampler2D _MainTex;
float4 _BumpMap_ST;
float _Cutoff;
float _GPUIBillboardCutoffOverride;
float _IsLinearSpace;
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float depth : TEXCOORD4;
//float3 normal : NORMAL;
float4 tangentToWorldX : TEXCOORD1;
float4 tangentToWorldY : TEXCOORD2;
float4 tangentToWorldZ : TEXCOORD3;
};
v2f vert (float4 uv : TEXCOORD0, float4 vertex : POSITION, float3 normal : NORMAL, float4 tangent : TANGENT)
{
v2f o;
o.vertex = UnityObjectToClipPos(vertex);
o.uv = uv;
float3 worldPos = mul(unity_ObjectToWorld,vertex);
float3 worldNormal = UnityObjectToWorldNormal(normal);
float3 worldTangent = UnityObjectToWorldDir(tangent.xyz);
float3 worldBinormal = cross(worldNormal, worldTangent) * tangent.w;
o.tangentToWorldX = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x);
o.tangentToWorldY = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);
o.tangentToWorldZ = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);
o.depth = -(UnityObjectToViewPos( vertex ).z * _ProjectionParams.w);
return o;
}
float4 frag (v2f i) : SV_Target
{
if (_GPUIBillboardCutoffOverride > 0.0){
_Cutoff = _GPUIBillboardCutoffOverride;
}
float3 textureNormal = UnpackNormal(tex2D(_BumpMap, TRANSFORM_TEX(i.uv, _BumpMap)));
float4 col = tex2D(_MainTex, i.uv);
clip (col.a - _Cutoff);
float3 worldPos = float3(i.tangentToWorldX.w, i.tangentToWorldY.w, i.tangentToWorldZ.w);
float3 worldNormal = normalize(float3(dot(i.tangentToWorldX.xyz, textureNormal), dot(i.tangentToWorldY.xyz, textureNormal), dot(i.tangentToWorldZ.xyz, textureNormal)));
#if UNITY_REVERSED_Z
i.depth = 1-i.depth;
#endif
// remap normals to [0, 1] (a is depth atlas) and account fot gamma correction if necessary
return float4((worldNormal.rgb * 0.5 + 0.5), i.depth) * (1 - _IsLinearSpace) + (_IsLinearSpace * float4(LinearToGamma(worldNormal.rgb * 0.5 + 0.5), LinearToGammaExact(i.depth)));
}
ENDCG
}
}
}