[require] GLSL >= 1.40 [fragment shader] #version 140 #extension GL_ARB_fragment_coord_conventions : require layout(origin_upper_left) in vec4 gl_FragCoord; out vec4 sk_FragColor; uniform vec4 uColor_Stage0; uniform float uinnerThreshold_Stage1; uniform float uouterThreshold_Stage1; uniform vec4 uinnerRect_Stage2; uniform vec2 uradiusPlusHalf_Stage2; uniform vec2 ubaseFrequency_Stage3_c0_c0; uniform vec2 ustitchData_Stage3_c0_c0; uniform vec4 urectUniform_Stage4; uniform sampler2D uTextureSampler_0_Stage1; uniform sampler2D uTextureSampler_0_Stage3; uniform sampler2D uTextureSampler_1_Stage3; noperspective in vec3 vDashParams_Stage0; noperspective in vec4 vRectParams_Stage0; noperspective in vec2 vTransformedCoords_0_Stage0; noperspective in vec2 vTransformedCoords_1_Stage0; float perlinnoise_Stage3_c0_c0(float chanCoord, vec2 noiseVec, vec2 stitchData) { vec4 floorVal; floorVal.xy = floor(noiseVec); floorVal.zw = floorVal.xy + vec2(1.0); vec2 fractVal = fract(noiseVec); vec2 noiseSmooth = (fractVal * fractVal) * (vec2(3.0) - vec2(2.0) * fractVal); if (floorVal.x >= stitchData.x) { floorVal.x -= stitchData.x; } if (floorVal.y >= stitchData.y) { floorVal.y -= stitchData.y; } if (floorVal.z >= stitchData.x) { floorVal.z -= stitchData.x; } if (floorVal.w >= stitchData.y) { floorVal.w -= stitchData.y; } floorVal = fract(floor(mod(floorVal, 256.0)) / vec4(256.0)); vec2 latticeIdx; latticeIdx.x = texture(uTextureSampler_0_Stage3, vec2(floorVal.x, 0.5)).x; latticeIdx.y = texture(uTextureSampler_0_Stage3, vec2(floorVal.z, 0.5)).x; vec4 bcoords = fract(latticeIdx.xyxy + floorVal.yyww); vec2 uv; vec4 lattice = texture(uTextureSampler_1_Stage3, vec2(bcoords.x, chanCoord)).zyxw; uv.x = dot((lattice.yw + lattice.xz * vec2(0.00390625)) * vec2(2.0) - vec2(1.0), fractVal); fractVal.x -= 1.0; lattice = texture(uTextureSampler_1_Stage3, vec2(bcoords.y, chanCoord)).zyxw; uv.y = dot((lattice.yw + lattice.xz * vec2(0.00390625)) * vec2(2.0) - vec2(1.0), fractVal); vec2 ab; ab.x = mix(uv.x, uv.y, noiseSmooth.x); fractVal.y -= 1.0; lattice = texture(uTextureSampler_1_Stage3, vec2(bcoords.w, chanCoord)).zyxw; uv.y = dot((lattice.yw + lattice.xz * vec2(0.00390625)) * vec2(2.0) - vec2(1.0), fractVal); fractVal.x += 1.0; lattice = texture(uTextureSampler_1_Stage3, vec2(bcoords.z, chanCoord)).zyxw; uv.x = dot((lattice.yw + lattice.xz * vec2(0.00390625)) * vec2(2.0) - vec2(1.0), fractVal); ab.y = mix(uv.x, uv.y, noiseSmooth.x); return mix(ab.x, ab.y, noiseSmooth.y); } vec4 PerlinNoise_Stage3_c0_c0(vec4 _input) { vec4 _output; vec2 noiseVec = floor(vTransformedCoords_1_Stage0) * ubaseFrequency_Stage3_c0_c0; _output = vec4(0.0); vec2 stitchData = ustitchData_Stage3_c0_c0; float ratio = 1.0; for (int octave = 0;octave < 3; ++octave) { _output += abs(vec4(perlinnoise_Stage3_c0_c0(0.125, noiseVec, stitchData), perlinnoise_Stage3_c0_c0(0.375, noiseVec, stitchData), perlinnoise_Stage3_c0_c0(0.625, noiseVec, stitchData), perlinnoise_Stage3_c0_c0(0.875, noiseVec, stitchData))) * ratio; noiseVec *= vec2(2.0); ratio *= 0.5; stitchData *= vec2(2.0); } _output = clamp(_output, 0.0, 1.0); _output = vec4(_output.xyz * _output.www, _output.w); return _output; } vec4 blend_src_in(vec4 src, vec4 dst) { return src * dst.w; } vec4 blend_dst_in(vec4 src, vec4 dst) { return blend_src_in(dst, src); } void main() { vec4 outputColor_Stage0; vec4 outputCoverage_Stage0; { outputColor_Stage0 = uColor_Stage0; float xShifted = vDashParams_Stage0.x - floor(vDashParams_Stage0.x / vDashParams_Stage0.z) * vDashParams_Stage0.z; vec2 fragPosShifted = vec2(xShifted, vDashParams_Stage0.y); float xSub, ySub; xSub = min(fragPosShifted.x - vRectParams_Stage0.x, 0.0); xSub += min(vRectParams_Stage0.z - fragPosShifted.x, 0.0); ySub = min(fragPosShifted.y - vRectParams_Stage0.y, 0.0); ySub += min(vRectParams_Stage0.w - fragPosShifted.y, 0.0); float alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0)); outputCoverage_Stage0 = vec4(alpha); } vec4 output_Stage1; { vec4 color = outputCoverage_Stage0; vec4 mask_color = texture(uTextureSampler_0_Stage1, vTransformedCoords_0_Stage0); if (mask_color.w < 0.5) { if (color.w > uouterThreshold_Stage1) { float scale = uouterThreshold_Stage1 / color.w; color.xyz *= scale; color.w = uouterThreshold_Stage1; } } else if (color.w < uinnerThreshold_Stage1) { float scale = uinnerThreshold_Stage1 / max(0.0010000000474974513, color.w); color.xyz *= scale; color.w = uinnerThreshold_Stage1; } output_Stage1 = color; } vec4 output_Stage2; { vec2 dxy0 = uinnerRect_Stage2.xy - gl_FragCoord.xy; vec2 dxy1 = gl_FragCoord.xy - uinnerRect_Stage2.zw; vec2 dxy = max(max(dxy0, dxy1), 0.0); float alpha = clamp(uradiusPlusHalf_Stage2.x - length(dxy), 0.0, 1.0); output_Stage2 = output_Stage1 * alpha; } vec4 output_Stage3; { output_Stage3 = blend_dst_in(output_Stage2, PerlinNoise_Stage3_c0_c0(vec4(1.0))); } vec4 output_Stage4; { float alpha; { alpha = float(all(greaterThan(vec4(gl_FragCoord.xy, urectUniform_Stage4.zw), vec4(urectUniform_Stage4.xy, gl_FragCoord.xy))) ? 1 : 0); } { alpha = 1.0 - alpha; } output_Stage4 = output_Stage3 * alpha; } { sk_FragColor = outputColor_Stage0 * output_Stage4; } } [vertex shader] #version 140 uniform vec4 sk_RTAdjust; uniform mat3 uCoordTransformMatrix_0_Stage0; uniform mat3 uCoordTransformMatrix_1_Stage0; in vec2 inPosition; in vec3 inDashParams; in vec4 inRect; noperspective out vec3 vDashParams_Stage0; noperspective out vec4 vRectParams_Stage0; noperspective out vec2 vTransformedCoords_0_Stage0; noperspective out vec2 vTransformedCoords_1_Stage0; void main() { vDashParams_Stage0 = inDashParams; vRectParams_Stage0 = inRect; vec2 pos2 = inPosition; vTransformedCoords_0_Stage0 = (uCoordTransformMatrix_0_Stage0 * vec3(inPosition, 1.0)).xy; vTransformedCoords_1_Stage0 = (uCoordTransformMatrix_1_Stage0 * vec3(inPosition, 1.0)).xy; gl_Position = vec4(pos2.x, pos2.y, 0.0, 1.0); gl_Position = vec4(gl_Position.xy * sk_RTAdjust.xz + gl_Position.ww * sk_RTAdjust.yw, 0.0, gl_Position.w); }