12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- /**
- * Slightly adapted from https://github.com/mrdoob/three.js
- * MIT License Copyright (c) 2010-2020 three.js authors
- *
- * WebGL port of Subpixel Morphological Antialiasing (SMAA) v2.8
- * Preset: SMAA 1x Medium (with color edge detection)
- * https://github.com/iryoku/smaa/releases/tag/v2.8
- */
- export const edges_frag = `
- precision highp float;
- precision highp int;
- precision highp sampler2D;
- uniform sampler2D tColor;
- uniform vec2 uTexSizeInv;
- varying vec2 vUv;
- varying vec4 vOffset[3];
- vec4 SMAAColorEdgeDetectionPS(vec2 texcoord, vec4 offset[3], sampler2D colorTex) {
- vec2 threshold = vec2(dEdgeThreshold, dEdgeThreshold);
- // Calculate color deltas:
- vec4 delta;
- vec3 C = texture2D(colorTex, texcoord).rgb;
- vec3 Cleft = texture2D(colorTex, offset[0].xy).rgb;
- vec3 t = abs(C - Cleft);
- delta.x = max(max(t.r, t.g), t.b);
- vec3 Ctop = texture2D(colorTex, offset[0].zw).rgb;
- t = abs(C - Ctop);
- delta.y = max(max(t.r, t.g), t.b);
- // We do the usual threshold:
- vec2 edges = step(threshold, delta.xy);
- // Then discard if there is no edge:
- if (dot(edges, vec2(1.0, 1.0 )) == 0.0)
- discard;
- // Calculate right and bottom deltas:
- vec3 Cright = texture2D(colorTex, offset[1].xy).rgb;
- t = abs( C - Cright );
- delta.z = max(max(t.r, t.g), t.b);
- vec3 Cbottom = texture2D(colorTex, offset[1].zw).rgb;
- t = abs(C - Cbottom);
- delta.w = max(max(t.r, t.g), t.b);
- // Calculate the maximum delta in the direct neighborhood:
- float maxDelta = max(max(max(delta.x, delta.y), delta.z), delta.w );
- // Calculate left-left and top-top deltas:
- vec3 Cleftleft = texture2D(colorTex, offset[2].xy).rgb;
- t = abs( C - Cleftleft );
- delta.z = max(max(t.r, t.g), t.b);
- vec3 Ctoptop = texture2D(colorTex, offset[2].zw).rgb;
- t = abs(C - Ctoptop);
- delta.w = max(max(t.r, t.g), t.b);
- // Calculate the final maximum delta:
- maxDelta = max(max(maxDelta, delta.z), delta.w);
- // Local contrast adaptation in action:
- edges.xy *= step(0.5 * maxDelta, delta.xy);
- return vec4(edges, 0.0, 0.0);
- }
- void main() {
- gl_FragColor = SMAAColorEdgeDetectionPS(vUv, vOffset, tColor);
- }
- `;
|