91 lines
2.8 KiB
Plaintext
91 lines
2.8 KiB
Plaintext
|
|
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
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|