360 lines
10 KiB
HLSL
360 lines
10 KiB
HLSL
|
#ifndef POIFRAG
|
||
|
#define POIFRAG
|
||
|
|
||
|
float _MainEmissionStrength;
|
||
|
float _IgnoreFog;
|
||
|
half _GIEmissionMultiplier;
|
||
|
uint _IridescenceTime;
|
||
|
uint _AlphaToMask;
|
||
|
float _ForceOpaque;
|
||
|
|
||
|
// Built-in uniforms for "vertex lights"
|
||
|
//uniform float4 unity_LightColor[4];
|
||
|
// array of the colors of the 4 light sources
|
||
|
//uniform float4 unity_4LightPosX0;
|
||
|
// x coordinates of the 4 light sources in world space
|
||
|
//uniform float4 unity_4LightPosY0;
|
||
|
// y coordinates of the 4 light sources in world space
|
||
|
//uniform float4 unity_4LightPosZ0;
|
||
|
// z coordinates of the 4 light sources in world space
|
||
|
//uniform float4 unity_4LightAtten0;
|
||
|
// scale factors for attenuation with squared distance
|
||
|
// uniform vec4 unity_LightPosition[4] is apparently not
|
||
|
// always correctly set in Unity 3.4
|
||
|
// uniform vec4 unity_LightAtten[4] is apparently not
|
||
|
// always correctly set in Unity 3.4
|
||
|
|
||
|
float4 frag(v2f i, uint facing: SV_IsFrontFace): SV_Target
|
||
|
{
|
||
|
#ifndef POI_LIGHTING
|
||
|
#ifdef FORWARD_ADD_PASS
|
||
|
return 0;
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
float3 finalLighting = 1;
|
||
|
float3 finalSpecular0 = 0;
|
||
|
float3 finalSpecular1 = 0;
|
||
|
float3 finalEnvironmentalRim = 0;
|
||
|
float3 finalSSS = 0;
|
||
|
fixed lightingAlpha = 1;
|
||
|
float3 IridescenceEmission = 0;
|
||
|
float bakedCubemap = 0; // Whether or not metallic should run before or after lighting multiplication
|
||
|
float3 spawnInEmission = 0;
|
||
|
float3 voronoiEmission = 0;
|
||
|
float3 matcapEmission = 0;
|
||
|
finalEmission = 0;
|
||
|
poiMesh.isFrontFace = facing;
|
||
|
//This has to be first because it modifies the UVs for the rest of the functions
|
||
|
|
||
|
#ifdef POI_DATA
|
||
|
InitData(i, facing);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_BLACKLIGHT
|
||
|
createBlackLightMask();
|
||
|
|
||
|
UNITY_BRANCH
|
||
|
if (_BlackLightMaskDebug)
|
||
|
{
|
||
|
return float4(blackLightMask.rgb, 1);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
// This has to happen in init because it alters UV data globally
|
||
|
#ifdef POI_PARALLAX
|
||
|
calculateandApplyParallax();
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_MAINTEXTURE
|
||
|
initTextureData();
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_DECAL
|
||
|
applyDecal(albedo);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_DATA
|
||
|
calculateLightingData(i);
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifdef POI_IRIDESCENCE
|
||
|
UNITY_BRANCH
|
||
|
if (_IridescenceTime == 0)
|
||
|
{
|
||
|
IridescenceEmission = applyIridescence(albedo);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_VORONOI
|
||
|
applyVoronoi(albedo, voronoiEmission);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_MSDF
|
||
|
ApplyTextOverlayColor(albedo);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_LIGHTING
|
||
|
finalLighting = calculateLighting(albedo.rgb);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_ENVIRONMENTAL_RIM
|
||
|
finalEnvironmentalRim = calculateEnvironmentalRimLighting();
|
||
|
#endif
|
||
|
|
||
|
#if defined(POI_METAL) || defined(POI_CLEARCOAT)
|
||
|
CalculateReflectionData();
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_DATA
|
||
|
distanceFade();
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_RANDOM
|
||
|
albedo.a *= i.angleAlpha;
|
||
|
#endif
|
||
|
|
||
|
#ifdef CUTOUT
|
||
|
UNITY_BRANCH
|
||
|
if(_AlphaToMask == 0)
|
||
|
{
|
||
|
applyDithering(albedo);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
albedo.a = max(_ForceOpaque, albedo.a);
|
||
|
|
||
|
#ifdef POI_FLIPBOOK
|
||
|
calculateFlipbook();
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_LIGHTING
|
||
|
#ifdef SUBSURFACE
|
||
|
finalSSS = calculateSubsurfaceScattering();
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_RIM
|
||
|
calculateRimLighting();
|
||
|
#endif
|
||
|
|
||
|
#ifdef PANOSPHERE
|
||
|
calculatePanosphere();
|
||
|
#endif
|
||
|
|
||
|
finalColor = albedo;
|
||
|
|
||
|
|
||
|
|
||
|
applySpawnIn(finalColor, spawnInEmission, poiMesh.uv[0], poiMesh.localPos);
|
||
|
|
||
|
#ifdef MATCAP
|
||
|
matcapEmission = applyMatcap(finalColor);
|
||
|
#endif
|
||
|
|
||
|
#ifdef PANOSPHERE
|
||
|
applyPanosphereColor(finalColor);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_FLIPBOOK
|
||
|
applyFlipbook(finalColor);
|
||
|
#endif
|
||
|
|
||
|
#ifndef OPAQUE
|
||
|
clip(finalColor.a - _Clip);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_RIM
|
||
|
applyRimColor(finalColor);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_DEPTH_COLOR
|
||
|
applyDepthColor(finalColor, finalEmission, poiCam.screenPos, poiCam.clipPos);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_IRIDESCENCE
|
||
|
UNITY_BRANCH
|
||
|
if(_IridescenceTime == 1)
|
||
|
{
|
||
|
IridescenceEmission = applyIridescence(finalColor);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
float4 finalColorBeforeLighting = finalColor;
|
||
|
|
||
|
#ifdef POI_SPECULAR
|
||
|
finalSpecular0 = calculateSpecular(finalColorBeforeLighting);
|
||
|
|
||
|
//return float4(finalSpecular0, 1);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_PARALLAX
|
||
|
calculateAndApplyInternalParallax(finalColor);
|
||
|
#endif
|
||
|
|
||
|
#if defined(FORWARD_BASE_PASS)
|
||
|
#ifdef POI_LIGHTING
|
||
|
#ifdef POI_SPECULAR
|
||
|
//applyLightingToSpecular();
|
||
|
//applySpecular(finalColor);
|
||
|
#endif
|
||
|
#endif
|
||
|
#endif
|
||
|
#if defined(FORWARD_BASE_PASS) || defined(POI_META_PASS)
|
||
|
finalEmission += finalColorBeforeLighting.rgb * _MainEmissionStrength * albedo.a;
|
||
|
finalEmission += wireframeEmission;
|
||
|
finalEmission += IridescenceEmission;
|
||
|
finalEmission += spawnInEmission;
|
||
|
finalEmission += voronoiEmission;
|
||
|
finalEmission += matcapEmission;
|
||
|
UNITY_BRANCH
|
||
|
if (_BackFaceEnabled)
|
||
|
{
|
||
|
finalEmission += BackFaceColor * _BackFaceEmissionStrength;
|
||
|
}
|
||
|
|
||
|
#ifdef PANOSPHERE
|
||
|
applyPanosphereEmission(finalEmission);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_EMISSION
|
||
|
finalEmission += calculateEmissionNew(finalColorBeforeLighting, finalColor);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_DISSOLVE
|
||
|
applyDissolveEmission(finalEmission);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_RIM
|
||
|
ApplyRimEmission(finalEmission);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_FLIPBOOK
|
||
|
applyFlipbookEmission(finalEmission);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_GLITTER
|
||
|
applyGlitter(finalEmission, finalColor);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_MSDF
|
||
|
{
|
||
|
ApplyTextOverlayEmission(finalEmission);
|
||
|
}
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_LIGHTING
|
||
|
#if(defined(POINT) || defined(SPOT))
|
||
|
#ifdef POI_METAL
|
||
|
//ApplyMetallics(finalColor, true);
|
||
|
#endif
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#if defined(TRANSPARENT) && defined(FORWARD_ADD_PASS)
|
||
|
finalColor.rgb *= finalColor.a;
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_VIDEO
|
||
|
applyScreenEffect(finalColor, finalColorBeforeLighting);
|
||
|
finalEmission += globalVideoEmission;
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_ALPHA_TO_COVERAGE
|
||
|
ApplyAlphaToCoverage(finalColor);
|
||
|
#endif
|
||
|
|
||
|
#ifdef CUTOUT
|
||
|
UNITY_BRANCH
|
||
|
if (_AlphaToMask == 1)
|
||
|
{
|
||
|
applyDithering(finalColor);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_METAL
|
||
|
bool probeExists = shouldMetalHappenBeforeLighting();
|
||
|
UNITY_BRANCH
|
||
|
if(!probeExists)
|
||
|
{
|
||
|
ApplyMetallicsFake(finalColor);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef VERTEXLIGHT_ON
|
||
|
finalColor.rgb *= finalLighting + poiLight.vFinalLighting;
|
||
|
#else
|
||
|
finalColor.rgb *= finalLighting;
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_METAL
|
||
|
UNITY_BRANCH
|
||
|
if(probeExists)
|
||
|
{
|
||
|
ApplyMetallics(finalColor);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
finalColor.rgb += finalSpecular0 + finalEnvironmentalRim + finalSSS;
|
||
|
|
||
|
#ifdef FORWARD_BASE_PASS
|
||
|
#ifdef POI_CLEARCOAT
|
||
|
calculateAndApplyClearCoat(finalColor);
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_DEBUG
|
||
|
displayDebugInfo(finalColor);
|
||
|
#endif
|
||
|
|
||
|
finalColor.a = saturate(finalColor.a);
|
||
|
|
||
|
|
||
|
#if defined(TRANSPARENT) || defined(CUTOUT)
|
||
|
//finalEmission *= finalColor.a;
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_META_PASS
|
||
|
UnityMetaInput meta;
|
||
|
UNITY_INITIALIZE_OUTPUT(UnityMetaInput, meta);
|
||
|
meta.Emission = finalEmission * _GIEmissionMultiplier;
|
||
|
meta.Albedo = saturate(finalColor.rgb);
|
||
|
#ifdef POI_SPECULAR
|
||
|
meta.SpecularColor = poiLight.color.rgb * _SpecularTint.rgb * lerp(1, albedo.rgb, _SpecularMetallic) * _SpecularTint.a;
|
||
|
#else
|
||
|
meta.SpecularColor = poiLight.color.rgb * albedo.rgb;
|
||
|
#endif
|
||
|
return UnityMetaFragment(meta);
|
||
|
#endif
|
||
|
|
||
|
finalColor.rgb += finalEmission;
|
||
|
|
||
|
#ifdef POI_GRAB
|
||
|
applyGrabEffects(finalColor);
|
||
|
#endif
|
||
|
|
||
|
#ifdef POI_BLUR
|
||
|
ApplyBlurToGrabPass(finalColor);
|
||
|
#endif
|
||
|
|
||
|
#ifdef FORWARD_BASE_PASS
|
||
|
UNITY_BRANCH
|
||
|
if (_IgnoreFog == 0)
|
||
|
{
|
||
|
UNITY_APPLY_FOG(i.fogCoord, finalColor);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef OPAQUE
|
||
|
finalColor.a = 1;
|
||
|
#endif
|
||
|
|
||
|
#ifdef FORWARD_ADD_PASS
|
||
|
finalColor.rgb *= finalColor.a;
|
||
|
#endif
|
||
|
|
||
|
return finalColor;
|
||
|
}
|
||
|
#endif
|