molstar
Version:
A comprehensive macromolecular library.
79 lines (61 loc) • 2.3 kB
JavaScript
"use strict";
/**
* 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
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.edges_frag = void 0;
exports.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);
}
`;