Files
2026-02-23 22:01:07 +07:00

380 lines
10 KiB
HLSL

#ifndef ALLIN13DSHADER_COMMON_STRUCTS
#define ALLIN13DSHADER_COMMON_STRUCTS
#define T_SPACE_PROPERTIES(n1, n2, n3) float3 tspace0 : TEXCOORD##n1; float3 tspace1 : TEXCOORD##n2; float3 tspace2 : TEXCOORD##n3;
#define INIT_T_SPACE(normalWS) \
o.tspace0 = float3(tangentWS.x, bitangentWS.x, normalWS.x); \
o.tspace1 = float3(tangentWS.y, bitangentWS.y, normalWS.y); \
o.tspace2 = float3(tangentWS.z, bitangentWS.z, normalWS.z);
#define INIT_DECAL_DATA(decalData) \
decalData.baseColor = float4(0, 0, 0, 1); \
decalData.normalTS = float4(0, 0, 0, 0); \
decalData.emissive = 0; \
decalData.mask = 0; \
decalData.unpackedNormal = float3(0, 0, 0); \
decalData.smoothness = 0; \
decalData.metallic = 0; \
decalData.MAOSAlpha = 1;
#define INIT_EFFECTS_DATA(data) \
data.mainUV = float2(0, 0); \
data.rawMainUV = float2(0, 0); \
data.normalizedScreenSpaceUV = float2(0, 0); \
data.vertexColor = float4(1, 1, 1, 1); \
data.vertexColorLuminosity = 1.0; \
data.vertexOS = float3(0, 0, 0); \
data.vertexWS = float3(0, 0, 0); \
data.vertexVS = float3(0, 0, 0); \
data.normalOS = float3(0, 1, 0); \
data.normalWS = float3(0, 1, 0); \
data.viewDirWS = float3(0, 0, -1); \
data.tangentWS = float3(1, 0, 0); \
data.bitangentWS = float3(0, 1, 0); \
data.projPos = float4(0, 0, 0, 0); \
data.pos = float4(0, 0, 0, 0); \
data.lightColor = float3(1, 1, 1); \
data.lightDir = float3(0, -1, 1); \
data.sceneDepthDiff = 1.0; \
data.normalizedDepth = 0; \
data.camDistance = 0; \
data.camDistanceViewSpace = 0; \
data.shaderTime = float3(0, 0, 0); \
data.uv_dist = float2(0, 0); \
data.uvMatrix = 0; \
data.uv_matrix_normalMap = 0; \
data.uv_normalMap = 0; \
data.uvDiff = 0; \
data._ShadowCoord = 0; \
data.metallic = 0; \
data.smoothness = 1;
#define INIT_GI(gi) \
gi.diffuse = float3(0, 0, 0); \
gi.shadowMask = float4(0, 0, 0, 0); \
gi.uvLightmap = float2(0, 0);
#define UV_FRONT(data) data.uvMatrix._m00_m01
#define UV_FRONT_WEIGHT(data) data.uvMatrix._m02
#define UV_SIDE(data) data.uvMatrix._m10_m11
#define UV_SIDE_WEIGHT(data) data.uvMatrix._m12
#define UV_TOP(data) data.uvMatrix._m20_m21
#define UV_TOP_WEIGHT(data) data.uvMatrix._m22
#define UV_DOWN(data) data.uvMatrix._m30_m31
#define UV_DOWN_WEIGHT(data) data.uvMatrix._m32
#define MAIN_UV(data) data.uvMatrix._m00_m01
//Main UV
#define SCALED_MAIN_UV(input) input.mainUV.xy
#define RAW_MAIN_UV(input) input.mainUV.zw
//Tangent WS
#define TANGENT_WS(input) float3(input.tspace0.x, input.tspace1.x, input.tspace2.x)
//Interpolator 01
#define UV_LIGHTMAP(input) input.interpolator_01.xy
#define UV_DIFF(input) input.interpolator_01.zw
//Interpolator 02
#define UV_NORMAL_MAP(input) input.interpolator_02.xy
#define UV_EMISSION_MAP(input) input.interpolator_02.zw
//Interpolator 03
#define SHADER_TIME(input) input.interpolator_03.xyz
#define FOGCOORD(input) input.interpolator_03.w
//Interpolator 04
#define NORMAL_OS(input) input.interpolator_04.xyz
#define VERTEX_COLOR_R(input) input.interpolator_04.w
//Interpolator 05
#define POSITION_OS(input) input.interpolator_05.xyz
#define VERTEX_COLOR_G(input) input.interpolator_05.w
//Interpolator 06
#define POSITION_WS(input) input.interpolator_06.xyz
#define VERTEX_COLOR_B(input) input.interpolator_06.w
//Interpolator 07
#define VIEWDIR_WS(input) input.interpolator_07.xyz
#define VERTEX_COLOR_A(input) input.interpolator_07.w
#ifdef _NORMAL_MAP_ON
#define NORMAL_UV_FRONT(data) data.uv_matrix_normalMap._m00_m01
#define NORMAL_UV_SIDE(data) data.uv_matrix_normalMap._m10_m11
#define NORMAL_UV_TOP(data) data.uv_matrix_normalMap._m20_m21
#define MAIN_NORMAL_UV(data) data.uv_matrix_normalMap._m00_m01
#endif
#ifdef _NORMAL_MAP_ON
#ifdef _TRIPLANAR_MAPPING_ON
#define DISPLACE_ALL_UVS(data, displacementAmount) \
UV_FRONT(data) += displacementAmount; \
UV_SIDE(data) += displacementAmount; \
UV_TOP(data) += displacementAmount; \
UV_DOWN(data) += displacementAmount; \
NORMAL_UV_FRONT(data) += displacementAmount; \
NORMAL_UV_SIDE(data) += displacementAmount; \
NORMAL_UV_TOP(data) += displacementAmount; \
data.rawMainUV += displacementAmount;
#define QUANTIZE_ALL_UVS(data, quantizeFactor) \
UV_FRONT(data) = floor(UV_FRONT(data) * quantizeFactor) / quantizeFactor; \
UV_SIDE(data) = floor(UV_SIDE(data) * quantizeFactor) / quantizeFactor; \
UV_TOP(data) = floor(UV_TOP(data) * quantizeFactor) / quantizeFactor; \
UV_DOWN(data) = floor(UV_DOWN(data) * quantizeFactor) / quantizeFactor; \
NORMAL_UV_FRONT(data) = floor(NORMAL_UV_FRONT(data) * quantizeFactor) / quantizeFactor; \
NORMAL_UV_SIDE(data) = floor(NORMAL_UV_SIDE(data) * quantizeFactor) / quantizeFactor; \
NORMAL_UV_TOP(data) = floor(NORMAL_UV_TOP(data) * quantizeFactor) / quantizeFactor; \
data.rawMainUV = floor(data.rawMainUV * quantizeFactor) / quantizeFactor;
#define FLOOR_ALL_UVS(data) \
UV_FRONT(data) = floor(UV_FRONT(data)); \
UV_SIDE(data) = floor(UV_SIDE(data)); \
UV_TOP(data) = floor(UV_TOP(data)); \
UV_DOWN(data) = floor(UV_DOWN(data)); \
NORMAL_UV_FRONT(data) = floor(NORMAL_UV_FRONT(data)); \
NORMAL_UV_SIDE(data) = floor(NORMAL_UV_SIDE(data)); \
NORMAL_UV_TOP(data) = floor(NORMAL_UV_TOP(data)); \
data.rawMainUV = floor(data.rawMainUV);
#else
#define QUANTIZE_ALL_UVS(data, quantizeFactor) \
MAIN_UV(data) = floor(MAIN_UV(data) * quantizeFactor) / quantizeFactor; \
MAIN_NORMAL_UV(data) = floor(MAIN_NORMAL_UV(data) * quantizeFactor) / quantizeFactor; \
data.rawMainUV = floor(data.rawMainUV * quantizeFactor) / quantizeFactor;
#define DISPLACE_ALL_UVS(data, displacementAmount) \
MAIN_UV(data) += displacementAmount; \
MAIN_NORMAL_UV(data) += displacementAmount; \
data.rawMainUV += displacementAmount;
#endif
#else
#ifdef _TRIPLANAR_MAPPING_ON
#define DISPLACE_ALL_UVS(data, displacementAmount) \
data.uvMatrix._m00_m01 += displacementAmount; \
data.uvMatrix._m10_m11 += displacementAmount; \
data.uvMatrix._m20_m21 += displacementAmount; \
data.uvMatrix._m30_m31 += displacementAmount; \
data.rawMainUV += displacementAmount;
#define QUANTIZE_ALL_UVS(data, quantizeFactor) \
data.uvMatrix._m00_m01 = floor(data.uvMatrix._m00_m01 * quantizeFactor) / quantizeFactor; \
data.uvMatrix._m10_m11 = floor(data.uvMatrix._m10_m11 * quantizeFactor) / quantizeFactor; \
data.uvMatrix._m20_m21 = floor(data.uvMatrix._m20_m21 * quantizeFactor) / quantizeFactor; \
data.uvMatrix._m30_m31 = floor(data.uvMatrix._m30_m31 * quantizeFactor) / quantizeFactor; \
data.rawMainUV = floor(data.rawMainUV * quantizeFactor) / quantizeFactor;
#else
#define DISPLACE_ALL_UVS(data, displacementAmount) \
MAIN_UV(data) += displacementAmount; \
data.rawMainUV += displacementAmount;
#define QUANTIZE_ALL_UVS(data, quantizeFactor) \
MAIN_UV(data) = floor(MAIN_UV(data) * quantizeFactor) / quantizeFactor; \
data.rawMainUV = floor(data.rawMainUV * quantizeFactor) / quantizeFactor;
#endif
#endif
#define RECALCULATE_NORMAL_OFFSET 0.01
struct AllIn1LightData
{
float3 lightColor;
float3 lightDir;
float realtimeShadow;
float4 shadowColor;
float distanceAttenuation;
uint layerMask;
};
struct AllIn1DecalData
{
float4 baseColor;
float4 normalTS;
float3 emissive;
float mask;
float3 unpackedNormal;
float smoothness;
float metallic;
float MAOSAlpha;
};
struct ShadowCoordStruct
{
float4 _ShadowCoord : TEXCOORD0;
float4 pos : TEXCOORD1;
};
struct FogStruct
{
float fogCoord : TEXCOORD0;
};
struct VertexData
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float2 uvLightmap : TEXCOORD1;
float3 normal : NORMAL;
float4 tangent : TANGENT;
float4 vertexColor : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct FragmentDataOutline
{
float4 pos : SV_POSITION;
float2 mainUV : TEXCOORD0;
float3 normalWS : TEXCOORD1;
float4 interpolator_01 : TEXCOORD2;
float4 interpolator_02 : TEXCOORD3;
float4 interpolator_03 : TEXCOORD4;
float3 positionWS : TEXCOORD5;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
struct FragmentData
{
float4 pos : SV_POSITION;
float4 mainUV : TEXCOORD0;
float3 normalWS : TEXCOORD1;
float4 interpolator_01 : TEXCOORD2;
float4 interpolator_02 : TEXCOORD3;
float4 interpolator_03 : TEXCOORD4;
float4 interpolator_04 : TEXCOORD5;
float4 interpolator_05 : TEXCOORD6;
float4 interpolator_06 : TEXCOORD7;
float4 interpolator_07 : TEXCOORD8;
#ifdef REQUIRE_TANGENT_WS
T_SPACE_PROPERTIES(9, 10, 11)
#endif
#if defined(REQUIRE_SCENE_DEPTH) || defined(LOD_FADE_CROSSFADE)
float4 projPos : TEXCOORD12;
#endif
float4 _ShadowCoord : TEXCOORD13;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
struct FragmentDataShadowCaster
{
float4 pos : SV_POSITION;
float4 positionOS : TEXCOORD1;
float2 mainUV : TEXCOORD2;
float3 positionWS : TEXCOORD3;
float2 uv2 : TEXCOORD4;
float3 shaderTime : TEXCOORD5;
float3 normalOS : TEXCOORD6;
float3 normalWS : TEXCOORD7;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
struct TriplanarData
{
float2 uv_triplanar_front;
float2 uv_triplanar_side;
float2 uv_triplanar_top;
};
struct AllIn1GI
{
float3 diffuse;
float4 shadowMask;
float2 uvLightmap;
};
//<AllIn1Struct name=EffectsData>
struct EffectsData
{
float2 mainUV;
float2 rawMainUV;
float2 normalizedScreenSpaceUV;
float4 vertexColor;
float vertexColorLuminosity;
float3 vertexOS;
float3 vertexWS;
float3 vertexVS;
float3 normalOS;
float3 normalWS;
float3 viewDirWS;
float3 tangentWS;
float3 bitangentWS;
float4 projPos;
float4 pos; //Patch to fix the error when UNITY_LIGHT_ATTENUATION is expanded
float3 lightColor;
float3 lightDir;
float sceneDepthDiff;
float normalizedDepth;
float camDistance;
float camDistanceViewSpace;
float3 shaderTime;
float2 uv_dist;
float4x3 uvMatrix;
float4x3 uv_matrix_normalMap;
float2 uv_normalMap;
float2 uvDiff;
float4 _ShadowCoord;
float metallic;
float smoothness;
};
//</AllIn1Struct>
#ifdef _TRIPLANAR_MAPPING_ON
float3 GetTriplanarWeights(float3 normal, float2 uv)
{
float3 weights = abs(normal);
float transition = 0.0;
#ifdef _TRIPLANAR_NOISE_TRANSITION_ON
float2 scaleUV = ACCESS_PROP_FLOAT4(_TriplanarNoiseTex_ST).xy;
transition = SAMPLE_TEX2D(_TriplanarNoiseTex, uv * scaleUV).r;
transition = (transition - 0.5) * 2.0;
transition *= ACCESS_PROP_FLOAT(_TriplanarTransitionPower);
normal.xz = lerp(float2(-0.5, -0.5), float2(0.5, 0.5), transition);
normal = normalize(normal);
weights = abs(normal);
#endif
weights = pow(weights, ACCESS_PROP_FLOAT(_TriplanarSharpness));
weights = weights / (weights.x + weights.y + weights.z);
return weights;
}
#endif
#endif