// Generated on <$_SCRIBE_DATE$> // // Created by Olivier Prat on 04/12/17. // Copyright 2017 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // <@if not FADE_SLH@> <@def FADE_SLH@> <@include render-utils/ShaderConstants.h@> <@func declareFadeFragmentCommon()@> <@include FadeObjectParams.shared.slh@> TEXTURE(RENDER_UTILS_TEXTURE_FADE_MASK, sampler2D, fadeMaskMap); vec2 hash2D(vec3 position) { return position.xy* vec2(0.1677, 0.221765) + position.z*0.561; } float noise3D(vec3 position) { float n = textureLod(fadeMaskMap, hash2D(position), 0.0).r; return pow(n, 1.0/2.2); // Remove sRGB. Need to fix this later directly in the texture } float evalFadeNoiseGradient(FadeObjectParams params, vec3 position) { // Do tri-linear interpolation vec3 noisePosition = position * params.noiseInvSizeAndLevel.xyz + params.noiseOffsetAndInverted.xyz; vec3 noisePositionFloored = floor(noisePosition); vec3 noisePositionFraction = fract(noisePosition); noisePositionFraction = noisePositionFraction*noisePositionFraction*(3.0 - 2.0*noisePositionFraction); float noiseLowXLowYLowZ = noise3D(noisePositionFloored); float noiseLowXHighYLowZ = noise3D(noisePositionFloored+vec3(0,1,0)); float noiseHighXLowYLowZ = noise3D(noisePositionFloored+vec3(1,0,0)); float noiseHighXHighYLowZ = noise3D(noisePositionFloored+vec3(1,1,0)); float noiseLowXLowYHighZ = noise3D(noisePositionFloored+vec3(0,0,1)); float noiseLowXHighYHighZ = noise3D(noisePositionFloored+vec3(0,1,1)); float noiseHighXLowYHighZ = noise3D(noisePositionFloored+vec3(1,0,1)); float noiseHighXHighYHighZ = noise3D(noisePositionFloored+vec3(1,1,1)); vec4 maskLowZ = vec4(noiseLowXLowYLowZ, noiseLowXHighYLowZ, noiseHighXLowYLowZ, noiseHighXHighYLowZ); vec4 maskHighZ = vec4(noiseLowXLowYHighZ, noiseLowXHighYHighZ, noiseHighXLowYHighZ, noiseHighXHighYHighZ); vec4 maskXY = mix(maskLowZ, maskHighZ, noisePositionFraction.z); vec2 maskY = mix(maskXY.xy, maskXY.zw, noisePositionFraction.x); float noise = mix(maskY.x, maskY.y, noisePositionFraction.y); noise -= 0.5; // Center on value 0 return noise * params.noiseInvSizeAndLevel.w; } float evalFadeBaseGradient(FadeObjectParams params, vec3 position) { float gradient = length((position - params.baseOffsetAndThreshold.xyz) * params.baseInvSizeAndLevel.xyz); gradient = gradient-0.5; // Center on value 0.5 gradient *= params.baseInvSizeAndLevel.w; return gradient; } float evalFadeGradient(FadeObjectParams params, vec3 position) { float baseGradient = evalFadeBaseGradient(params, position); float noiseGradient = evalFadeNoiseGradient(params, position); float gradient = noiseGradient+baseGradient+0.5; return gradient; } float evalFadeAlpha(FadeObjectParams params, vec3 position) { float alpha = evalFadeGradient(params, position) - params.baseOffsetAndThreshold.w; alpha *= 1.0 - 2.0 * params.noiseOffsetAndInverted.w; return alpha; } void applyFadeClip(FadeObjectParams params, vec3 position) { if (evalFadeAlpha(params, position) < 0.0) { discard; } } void applyFade(FadeObjectParams params, vec3 position, out vec3 emissive) { float alpha = evalFadeAlpha(params, position); if (alpha < 0.0) { discard; } float edgeMask = alpha * params.edgeWidthInv; float edgeAlpha = 1.0-clamp(edgeMask, 0.0, 1.0); edgeMask = step(edgeMask, 1.0); edgeAlpha *= edgeAlpha; // Square to have a nice ease out vec4 color = mix(params.innerEdgeColor, params.outerEdgeColor, edgeAlpha); emissive = color.rgb * edgeMask * color.a; } <@endfunc@> <@func declareFadeFragmentUniform()@> UNIFORM_BUFFER(RENDER_UTILS_BUFFER_FADE_OBJECT_PARAMS, fadeObjectParametersBuffer) { FadeObjectParams fadeObjectParams; }; <@endfunc@> <@func fetchFadeObjectParams(fadeParams)@> <$fadeParams$> = fadeObjectParams; <@endfunc@> <@func declareFadeFragmentVertexInput()@> FLAT_INPUT(RENDER_UTILS_ATTR_FADE1, vec4, _fadeData1); FLAT_INPUT(RENDER_UTILS_ATTR_FADE2, vec4, _fadeData2); FLAT_INPUT(RENDER_UTILS_ATTR_FADE3, vec4, _fadeData3); FLAT_INPUT(RENDER_UTILS_ATTR_FADE4, vec4, _fadeData4); FLAT_INPUT(RENDER_UTILS_ATTR_FADE5, vec4, _fadeData5); FLAT_INPUT(RENDER_UTILS_ATTR_FADE6, vec4, _fadeData6); FLAT_INPUT(RENDER_UTILS_ATTR_FADE7, float, _fadeData7); <@endfunc@> <@func fetchFadeObjectParamsInstanced(fadeParams)@> <$fadeParams$>.noiseOffsetAndInverted = _fadeData1; <$fadeParams$>.baseOffsetAndThreshold = _fadeData2; <$fadeParams$>.baseInvSizeAndLevel = _fadeData3; <$fadeParams$>.noiseInvSizeAndLevel = _fadeData4; <$fadeParams$>.innerEdgeColor = _fadeData5; <$fadeParams$>.outerEdgeColor = _fadeData6; <$fadeParams$>.edgeWidthInv = _fadeData7; <@endfunc@> <@func declareFadeFragment()@> <$declareFadeFragmentCommon()$> <$declareFadeFragmentUniform()$> <@endfunc@> <@func declareFadeFragmentInstanced()@> <$declareFadeFragmentCommon()$> <$declareFadeFragmentVertexInput()$> <@endfunc@> <@func declareFadeVertexInstanced()@> INPUT(GPU_ATTR_FADEDATA1, vec4, fadeData1); INPUT(GPU_ATTR_FADEDATA2, vec4, fadeData2); INPUT(GPU_ATTR_FADEDATA3, vec4, fadeData3); INPUT(GPU_ATTR_FADEDATA4, vec4, fadeData4); INPUT(GPU_ATTR_FADEDATA5, vec4, fadeData5); INPUT(GPU_ATTR_FADEDATA6, vec4, fadeData6); INPUT(GPU_ATTR_FADEDATA7, float, fadeData7); FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE1, vec4, _fadeData1); FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE2, vec4, _fadeData2); FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE3, vec4, _fadeData3); FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE4, vec4, _fadeData4); FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE5, vec4, _fadeData5); FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE6, vec4, _fadeData6); FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE7, float, _fadeData7); <@endfunc@> <@func passThroughFadeObjectParams()@> _fadeData1 = fadeData1; _fadeData2 = fadeData2; _fadeData3 = fadeData3; _fadeData4 = fadeData4; _fadeData5 = fadeData5; _fadeData6 = fadeData6; _fadeData7 = fadeData7; <@endfunc@> <@endif@>