res-avatar-unity/Assets/_PoiyomiShaders/Shaders/7.3/Includes/CGI_PoiFrag.cginc

360 lines
10 KiB
HLSL
Raw Normal View History

2023-07-16 02:51:23 +00:00
#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