252 lines
6.6 KiB
HLSL
252 lines
6.6 KiB
HLSL
#ifndef ALLIN13DSHADER_BASE_PASS_INCLUDED
|
|
#define ALLIN13DSHADER_BASE_PASS_INCLUDED
|
|
|
|
FragmentData BasicVertex(VertexData v)
|
|
{
|
|
FragmentData o;
|
|
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
|
|
|
#ifdef _SPHERIZE_NORMALS_ON
|
|
float3 normalOS = normalize(v.vertex);
|
|
#else
|
|
float3 normalOS = v.normal;
|
|
#endif
|
|
|
|
o.interpolator_01 = 0;
|
|
|
|
#ifdef _USE_CUSTOM_TIME
|
|
SHADER_TIME(o) = allIn13DShader_globalTime.xyz + ACCESS_PROP_FLOAT(_TimingSeed);
|
|
#else
|
|
SHADER_TIME(o) = _Time.xyz + ACCESS_PROP_FLOAT(_TimingSeed);
|
|
#endif
|
|
|
|
float3 originalVertex = v.vertex.xyz;
|
|
|
|
v.vertex = ApplyVertexEffects(v.vertex, normalOS, SHADER_TIME(o));
|
|
#ifdef _RECALCULATE_NORMALS_ON
|
|
float3 tangentNeighbour = originalVertex + normalize(v.tangent.xyz) * RECALCULATE_NORMAL_OFFSET;
|
|
float3 bitangent = normalize(cross(v.normal, v.tangent.xyz));
|
|
float3 bitangentNeightbour = originalVertex + bitangent * RECALCULATE_NORMAL_OFFSET;
|
|
|
|
tangentNeighbour = ApplyVertexEffects(float4(tangentNeighbour, 1.0), normalOS, SHADER_TIME(o)).xyz;
|
|
bitangentNeightbour = ApplyVertexEffects(float4(bitangentNeightbour, 1.0), normalOS, SHADER_TIME(o)).xyz;
|
|
|
|
float3 correctedTangent = normalize(tangentNeighbour - v.vertex.xyz);
|
|
float3 correctedBitangent = normalize(bitangentNeightbour - v.vertex.xyz);
|
|
|
|
v.tangent = float4(correctedTangent, v.tangent.w);
|
|
normalOS = normalize(cross(correctedTangent, correctedBitangent));
|
|
#endif
|
|
|
|
|
|
POSITION_OS(o) = v.vertex.xyz;
|
|
NORMAL_OS(o) = normalOS;
|
|
POSITION_WS(o) = GetPositionWS(v.vertex);
|
|
|
|
o.normalWS = GetNormalWS(normalOS);
|
|
|
|
o.pos = OBJECT_TO_CLIP_SPACE(v);
|
|
|
|
|
|
|
|
VIEWDIR_WS(o) = GetViewDirWS(POSITION_WS(o));
|
|
|
|
float4 projPos = 0;
|
|
|
|
|
|
#if defined(REQUIRE_SCREEN_POS)
|
|
o.projPos = ComputeScreenPos(o.pos);
|
|
|
|
#if defined(REQUIRE_SCENE_DEPTH)
|
|
o.projPos.z = ComputeEyeDepth(POSITION_WS(o));
|
|
#endif
|
|
|
|
projPos = o.projPos;
|
|
#endif
|
|
|
|
float2 uv = v.uv;
|
|
uv = ApplyUVEffects_VertexStage(uv, POSITION_WS(o), projPos, SHADER_TIME(o));
|
|
|
|
UV_DIFF(o) = uv - v.uv;
|
|
|
|
SCALED_MAIN_UV(o) = CUSTOM_TRANSFORM_TEX(v.uv, UV_DIFF(o), _MainTex);
|
|
RAW_MAIN_UV(o) = uv;
|
|
|
|
o.interpolator_02 = 0;
|
|
|
|
|
|
#if defined(REQUIRE_TANGENT_WS)
|
|
float3 tangentWS = GetDirWS(float4(v.tangent.xyz, 0));
|
|
float3 bitangentWS = GetBitangentWS(v.tangent, tangentWS, o.normalWS);
|
|
INIT_T_SPACE(o.normalWS)
|
|
|
|
UV_NORMAL_MAP(o) = CUSTOM_TRANSFORM_TEX(v.uv, UV_DIFF(o), _NormalMap);
|
|
#endif
|
|
|
|
ShadowCoordStruct shadowCoordStruct = GetShadowCoords(v, o.pos, POSITION_WS(o), v.uvLightmap);
|
|
o._ShadowCoord = shadowCoordStruct._ShadowCoord;
|
|
|
|
#ifdef LIGHTMAP_ON
|
|
UV_LIGHTMAP(o) = v.uvLightmap * unity_LightmapST.xy + unity_LightmapST.zw;
|
|
#else
|
|
UV_LIGHTMAP(o) = v.uvLightmap;
|
|
#endif
|
|
FOGCOORD(o) = GetFogFactor(o.pos);
|
|
|
|
#ifdef _EMISSION_ON
|
|
UV_EMISSION_MAP(o) = SIMPLE_CUSTOM_TRANSFORM_TEX(v.uv, _EmissionMap);
|
|
#endif
|
|
|
|
|
|
//Vertex Color initialization
|
|
VERTEX_COLOR_R(o) = v.vertexColor.r;
|
|
VERTEX_COLOR_G(o) = v.vertexColor.g;
|
|
VERTEX_COLOR_B(o) = v.vertexColor.b;
|
|
VERTEX_COLOR_A(o) = v.vertexColor.a;
|
|
|
|
return o;
|
|
}
|
|
|
|
float4 BasicFragment(
|
|
FragmentData i
|
|
#ifdef _WRITE_RENDERING_LAYERS
|
|
#if UNITY_VERSION >= 60020000
|
|
, out uint outRenderingLayers : SV_Target1
|
|
#else
|
|
, out float4 outRenderingLayers : SV_Target1
|
|
#endif
|
|
#endif
|
|
) : SV_Target
|
|
{
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
|
|
#if defined(LOD_FADE_CROSSFADE)
|
|
ALLIN1_APPLY_CROSSFADE(i)
|
|
#endif
|
|
|
|
AllIn1DecalData decalData;
|
|
INIT_DECAL_DATA(decalData);
|
|
|
|
#ifdef ALLIN1_DECALS_READY_TO_USE
|
|
ConfigureDecalData(decalData, i.pos);
|
|
#endif
|
|
|
|
|
|
#if defined(_FLAT_NORMALS_ON)
|
|
i.normalWS = GetFlatNormalWS(i.normalWS, POSITION_WS(i));
|
|
#if defined(REQUIRE_TANGENT_WS)
|
|
i.tspace0 = float3(i.tspace0.x, i.tspace0.y, i.normalWS.x);
|
|
i.tspace1 = float3(i.tspace1.x, i.tspace1.y, i.normalWS.y);
|
|
i.tspace2 = float3(i.tspace2.x, i.tspace2.y, i.normalWS.z);
|
|
#endif
|
|
#endif
|
|
|
|
EffectsData data = CalculateEffectsData(i, decalData);
|
|
|
|
data = ApplyUVEffects_FragmentStage(data);
|
|
|
|
|
|
data.normalWS = GetNormalWS(data, i, decalData);
|
|
|
|
|
|
|
|
#ifdef _NORMAL_MAP_ON
|
|
data.bitangentWS = normalize(cross(data.normalWS, data.tangentWS));
|
|
#endif
|
|
|
|
float4 objectColor = GetBaseColor(data);
|
|
|
|
float3 normalOS = data.normalOS;
|
|
float3 normalWS = data.normalWS;
|
|
float3 viewDirWS = data.viewDirWS;
|
|
|
|
float sceneDepthDiff = 1.0;
|
|
float normalizedDepth = 0;
|
|
#ifdef REQUIRE_SCENE_DEPTH
|
|
sceneDepthDiff = GetSceneDepthDiff(i.projPos);
|
|
normalizedDepth = GetNormalizedDepth(i.projPos);
|
|
#endif
|
|
|
|
float camDistance = 0;
|
|
#ifdef REQUIRE_CAM_DISTANCE
|
|
camDistance = distance(POSITION_WS(i), _WorldSpaceCameraPos);
|
|
#endif
|
|
|
|
objectColor *= ACCESS_PROP_FLOAT4(_Color);
|
|
objectColor = ApplyColorEffectsBeforeLighting(objectColor, data);
|
|
|
|
#ifdef ALLIN1_DECALS_READY_TO_USE
|
|
objectColor.rgb = objectColor.rgb * decalData.baseColor.a + decalData.baseColor.rgb;
|
|
#endif
|
|
|
|
float4 col = objectColor;
|
|
|
|
|
|
|
|
AllIn1GI gi = CalculateGI(UV_LIGHTMAP(i), data);
|
|
float3 lightmap = GetLightmap(UV_LIGHTMAP(i), data);
|
|
#if defined(_AFFECTED_BY_LIGHTMAPS_ON) && defined(_LIGHTMAP_COLOR_CORRECTION_ON)
|
|
lightmap = LightmapColorCorrection(lightmap);
|
|
#endif
|
|
|
|
|
|
float3 ambientColor = GetAmbientColor(data);
|
|
|
|
#ifdef LIGHT_ON
|
|
float3 mainLightColor = GetMainLightColorRGB();
|
|
float3 mainLightDir = GetMainLightDir(POSITION_WS(i));
|
|
|
|
col.rgb = CalculateLighting(
|
|
POSITION_WS(i),
|
|
normalWS, data.tangentWS, data.bitangentWS,
|
|
objectColor.rgb, objectColor.a,
|
|
1.0, ambientColor, viewDirWS,
|
|
SCALED_MAIN_UV(i), mainLightColor, mainLightDir, i, 1.0, data,
|
|
gi);
|
|
#else
|
|
float2 ssaoFactor = GetSSAO(data.normalizedScreenSpaceUV.xy, objectColor.a);
|
|
col.rgb = IndirectLighting_Basic(objectColor.rgb, ssaoFactor, data, gi);
|
|
#endif
|
|
|
|
#ifdef _EMISSION_ON
|
|
float2 emissionUV = SIMPLE_CUSTOM_TRANSFORM_TEX(MAIN_UV(data), _EmissionMap);
|
|
float4 emissionMapCol = SAMPLE_TEX2D(_EmissionMap, emissionUV);
|
|
float4 emissionCol = emissionMapCol * ACCESS_PROP_FLOAT4(_EmissionColor) * ACCESS_PROP_FLOAT(_EmissionSelfGlow);
|
|
|
|
emissionCol.rgb += decalData.emissive;
|
|
|
|
col.rgb += emissionCol.rgb;
|
|
#endif
|
|
|
|
col = ApplyAlphaEffects(col,
|
|
SCALED_MAIN_UV(i), UV_LIGHTMAP(i), data.vertexWS,
|
|
sceneDepthDiff, data.camDistance, data.projPos);
|
|
|
|
#ifdef _ALPHA_CUTOFF_ON
|
|
clip((col.a - ACCESS_PROP_FLOAT(_AlphaCutoffValue)) - 0.001);
|
|
#endif
|
|
|
|
col = ApplyColorEffectsAfterLighting(col, data);
|
|
col.a *= ACCESS_PROP_FLOAT(_GeneralAlpha);
|
|
|
|
#if defined(FOG_ENABLED)
|
|
col = CustomMixFog(FOGCOORD(i), col);
|
|
#endif
|
|
|
|
#if defined(_WRITE_RENDERING_LAYERS)
|
|
#if UNITY_VERSION >= 60020000
|
|
outRenderingLayers = EncodeMeshRenderingLayer();
|
|
#else
|
|
uint renderingLayers = AllIn1GetMeshRenderingLayer();
|
|
outRenderingLayers = float4(EncodeMeshRenderingLayer(renderingLayers), 0, 0, 0);
|
|
#endif
|
|
#endif
|
|
|
|
return col;
|
|
}
|
|
|
|
#endif /*ALLIN13DSHADER_BASE_PASS_INCLUDED*/ |