diff options
Diffstat (limited to 'VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Includes/CGI_PoiEmission.cginc')
-rw-r--r-- | VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Includes/CGI_PoiEmission.cginc | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Includes/CGI_PoiEmission.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Includes/CGI_PoiEmission.cginc new file mode 100644 index 00000000..12d20eb7 --- /dev/null +++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Includes/CGI_PoiEmission.cginc @@ -0,0 +1,198 @@ +#ifndef POI_EMISSION + #define POI_EMISSION + + float4 _EmissionColor; + POI_TEXTURE_NOSAMPLER(_EmissionMap); + POI_TEXTURE_NOSAMPLER(_EmissionMask); + float _EmissionBaseColorAsMap; + float _EmissionStrength; + float _EnableEmission; + float _EmissionHueShift; + float4 _EmissiveScroll_Direction; + float _EmissiveScroll_Width; + float _EmissiveScroll_Velocity; + float _EmissiveScroll_Interval; + float _EmissiveBlink_Min; + float _EmissiveBlink_Max; + float _EmissiveBlink_Velocity; + float _ScrollingEmission; + float _EnableGITDEmission; + float _GITDEMinEmissionMultiplier; + float _GITDEMaxEmissionMultiplier; + float _GITDEMinLight; + float _GITDEMaxLight; + uint _GITDEWorldOrMesh; + float _EmissionCenterOutEnabled; + float _EmissionCenterOutSpeed; + float _EmissionHueShiftEnabled; + float _EmissionBlinkingOffset; + float _EmissionScrollingOffset; + + float4 _EmissionColor1; + POI_TEXTURE_NOSAMPLER(_EmissionMap1); + POI_TEXTURE_NOSAMPLER(_EmissionMask1); + float _EmissionBaseColorAsMap1; + float _EmissionStrength1; + float _EnableEmission1; + float _EmissionHueShift1; + float4 _EmissiveScroll_Direction1; + float _EmissiveScroll_Width1; + float _EmissiveScroll_Velocity1; + float _EmissiveScroll_Interval1; + float _EmissiveBlink_Min1; + float _EmissiveBlink_Max1; + float _EmissiveBlink_Velocity1; + float _ScrollingEmission1; + float _EnableGITDEmission1; + float _GITDEMinEmissionMultiplier1; + float _GITDEMaxEmissionMultiplier1; + float _GITDEMinLight1; + float _GITDEMaxLight1; + uint _GITDEWorldOrMesh1; + float _EmissionCenterOutEnabled1; + float _EmissionCenterOutSpeed1; + float _EmissionHueShiftEnabled1; + float _EmissionBlinkingOffset1; + float _EmissionScrollingOffset1; + + float _EmissionReplace; + + float _EmissionScrollingUseCurve; + float _EmissionScrollingUseCurve1; + UNITY_DECLARE_TEX2D_NOSAMPLER(_EmissionScrollingCurve); float4 _EmissionScrollingCurve_ST; + UNITY_DECLARE_TEX2D_NOSAMPLER(_EmissionScrollingCurve1); float4 _EmissionScrollingCurve1_ST; + + float calculateGlowInTheDark(in float minLight, in float maxLight, in float minEmissionMultiplier, in float maxEmissionMultiplier, in float enabled) + { + float glowInTheDarkMultiplier = 1; + + #ifdef POI_LIGHTING + float3 lightValue = _GITDEWorldOrMesh ? poiLight.finalLighting.rgb: poiLight.directLighting.rgb; + float gitdeAlpha = (clamp(poiMax(lightValue), minLight, maxLight) - minLight) / (maxLight - minLight); + glowInTheDarkMultiplier = lerp(minEmissionMultiplier, maxEmissionMultiplier, gitdeAlpha); + glowInTheDarkMultiplier = lerp(1, glowInTheDarkMultiplier, enabled); + #endif + + return glowInTheDarkMultiplier; + } + + float calculateScrollingEmission(in float3 direction, in float velocity, in float interval, in float scrollWidth, in float enabled, float offset) + { + float phase = 0; + phase = dot(poiMesh.localPos, direction); + phase -= (_Time.y + offset) * velocity; + phase /= interval; + phase -= floor(phase); + float width = scrollWidth; + phase = (pow(phase, width) + pow(1 - phase, width * 4)) * 0.5; + return lerp(1, phase, enabled); + } + + float calculateBlinkingEmission(in float blinkMin, in float blinkMax, in float blinkVelocity, float offset) + { + float amplitude = (blinkMax - blinkMin) * 0.5f; + float base = blinkMin + amplitude; + return sin((_Time.y + offset) * blinkVelocity) * amplitude + base; + } + + float3 calculateEmissionNew(in float4 baseColor, inout float4 finalColor) + { + // First Emission + float3 emission0 = 0; + float emissionStrength0 = _EmissionStrength; + float3 emissionColor0 = 0; + + float glowInTheDarkMultiplier0 = calculateGlowInTheDark(_GITDEMinLight, _GITDEMaxLight, _GITDEMinEmissionMultiplier, _GITDEMaxEmissionMultiplier, _EnableGITDEmission); + + UNITY_BRANCH + if (!_EmissionCenterOutEnabled) + { + emissionColor0 = POI2D_SAMPLER_PAN(_EmissionMap, _MainTex, poiMesh.uv[_EmissionMapUV], _EmissionMapPan) * lerp(1, baseColor, _EmissionBaseColorAsMap).rgb * _EmissionColor.rgb; + } + else + { + emissionColor0 = UNITY_SAMPLE_TEX2D_SAMPLER(_EmissionMap, _MainTex, ((.5 + poiLight.nDotV * .5) * _EmissionMap_ST.xy) + _Time.x * _EmissionCenterOutSpeed) * lerp(1, baseColor, _EmissionBaseColorAsMap).rgb * _EmissionColor.rgb; + } + + UNITY_BRANCH + if(_EmissionScrollingUseCurve) + { + emissionStrength0 *= lerp(1, UNITY_SAMPLE_TEX2D_SAMPLER(_EmissionScrollingCurve, _MainTex, TRANSFORM_TEX(poiMesh.uv[_EmissionMapUV], _EmissionScrollingCurve) + (dot(poiMesh.localPos, _EmissiveScroll_Direction) * _EmissiveScroll_Interval) + _Time.x * _EmissiveScroll_Velocity), _ScrollingEmission); + } + else + { + emissionStrength0 *= calculateScrollingEmission(_EmissiveScroll_Direction, _EmissiveScroll_Velocity, _EmissiveScroll_Interval, _EmissiveScroll_Width, _ScrollingEmission, _EmissionScrollingOffset); + } + + emissionStrength0 *= calculateBlinkingEmission(_EmissiveBlink_Min, _EmissiveBlink_Max, _EmissiveBlink_Velocity, _EmissionBlinkingOffset); + emissionColor0 = hueShift(emissionColor0, _EmissionHueShift * _EmissionHueShiftEnabled); + float emissionMask0 = UNITY_SAMPLE_TEX2D_SAMPLER(_EmissionMask, _MainTex, TRANSFORM_TEX(poiMesh.uv[_EmissionMaskUV], _EmissionMask) + _Time.x * _EmissionMaskPan); + + #ifdef POI_BLACKLIGHT + if(_BlackLightMaskEmission != 4) + { + emissionMask0 *= blackLightMask[_BlackLightMaskEmission]; + } + #endif + + emissionStrength0 *= glowInTheDarkMultiplier0 * emissionMask0; + emission0 = emissionStrength0 * emissionColor0; + + #ifdef POI_DISSOLVE + emission0 *= lerp(1 - dissolveAlpha, dissolveAlpha, _DissolveEmissionSide); + #endif + + // Second Emission + float3 emission1 = 0; + float emissionStrength1 = 0; + float3 emissionColor1 = 0; + + UNITY_BRANCH + if (_EnableEmission1) + { + emissionStrength1 = _EmissionStrength1; + float glowInTheDarkMultiplier1 = calculateGlowInTheDark(_GITDEMinLight1, _GITDEMaxLight1, _GITDEMinEmissionMultiplier1, _GITDEMaxEmissionMultiplier1, _EnableGITDEmission1); + + UNITY_BRANCH + if(!_EmissionCenterOutEnabled1) + { + emissionColor1 = POI2D_SAMPLER_PAN(_EmissionMap1, _MainTex, poiMesh.uv[_EmissionMap1UV], _EmissionMap1Pan) * lerp(1, baseColor, _EmissionBaseColorAsMap1).rgb * _EmissionColor1.rgb; + } + else + { + emissionColor1 = UNITY_SAMPLE_TEX2D_SAMPLER(_EmissionMap1, _MainTex, ((.5 + poiLight.nDotV * .5) * _EmissionMap_ST.xy) + _Time.x * _EmissionCenterOutSpeed1).rgb * lerp(1, baseColor, _EmissionBaseColorAsMap1).rgb * _EmissionColor1.rgb; + } + + UNITY_BRANCH + if(_EmissionScrollingUseCurve1) + { + emissionStrength1 *= lerp(1, UNITY_SAMPLE_TEX2D_SAMPLER(_EmissionScrollingCurve1, _MainTex, TRANSFORM_TEX(poiMesh.uv[_EmissionMap1UV], _EmissionScrollingCurve1) + (dot(poiMesh.localPos, _EmissiveScroll_Direction1) * _EmissiveScroll_Interval1) + _Time.x * _EmissiveScroll_Velocity1), _ScrollingEmission1); + } + else + { + emissionStrength1 *= calculateScrollingEmission(_EmissiveScroll_Direction1, _EmissiveScroll_Velocity1, _EmissiveScroll_Interval1, _EmissiveScroll_Width1, _ScrollingEmission1, _EmissionScrollingOffset1); + } + + emissionStrength1 *= calculateBlinkingEmission(_EmissiveBlink_Min1, _EmissiveBlink_Max1, _EmissiveBlink_Velocity1, _EmissionBlinkingOffset1); + emissionColor1 = hueShift(emissionColor1, _EmissionHueShift1 * _EmissionHueShiftEnabled1); + float emissionMask1 = UNITY_SAMPLE_TEX2D_SAMPLER(_EmissionMask1, _MainTex, TRANSFORM_TEX(poiMesh.uv[_EmissionMask1UV], _EmissionMask1) + _Time.x * _EmissionMask1Pan); + #ifdef POI_BLACKLIGHT + if(_BlackLightMaskEmission2 != 4) + { + emissionMask1 *= blackLightMask[_BlackLightMaskEmission2]; + } + #endif + emissionStrength1 *= glowInTheDarkMultiplier1 * emissionMask1; + emission1 = emissionStrength1 * emissionColor1; + + #ifdef POI_DISSOLVE + emission1 *= lerp(1 - dissolveAlpha, dissolveAlpha, _DissolveEmission1Side); + #endif + } + + finalColor.rgb = lerp(finalColor.rgb, saturate(emissionColor0 + emissionColor1), saturate(emissionStrength0 + emissionStrength1) * _EmissionReplace * poiMax(emission0 + emission1)); + + return emission0 + emission1; + } + +#endif
\ No newline at end of file |