12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- /*
- All material copyright ESRI, All Rights Reserved, unless otherwise specified.
- See https://js.arcgis.com/4.25/esri/copyright.txt for details.
- */
- import{glsl as e}from"../views/3d/webgl-engine/core/shaderModules/interfaces.js";import{ShaderBuilder as t}from"../views/3d/webgl-engine/core/shaderModules/ShaderBuilder.js";import{Texture2DPassUniform as o}from"../views/3d/webgl-engine/core/shaderModules/Texture2DPassUniform.js";import{VertexAttribute as a}from"../views/3d/webgl-engine/lib/VertexAttribute.js";import{addResolutionUniform as r}from"../views/3d/webgl-engine/shaders/SMAAPassParameters.js";const d={threshold:.05,localConstrastAdaption:2};function l(){const l=new t,{attributes:s,varyings:c,vertex:x,fragment:i}=l;return s.add(a.POSITION,"vec2"),r(x),c.add("fTexCoord","vec2"),c.add("fOffset[3]","vec4"),x.code.add(e`void EdgeDetectEdgeDetectionVS( vec2 texcoord ) {
- fOffset[0] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0, 1.0 );
- fOffset[1] = texcoord.xyxy + resolution.xyxy * vec4( 1.0, 0.0, 0.0, -1.0 );
- fOffset[2] = texcoord.xyxy + resolution.xyxy * vec4( -2.0, 0.0, 0.0, 2.0 );
- }
- void main() {
- fTexCoord = (position + 1.0) * 0.5;
- gl_Position = vec4(position, 0, 1);
- EdgeDetectEdgeDetectionVS(fTexCoord);
- }`),i.uniforms.add(new o("tColor",(e=>e.colorTexture))),i.code.add(e`
- vec4 EdgeDetectColorEdgeDetectionPS(vec2 texcoord, vec4 offset[3], sampler2D colorTex) {
- vec2 threshold = vec2( ${e.float(d.threshold)} );
- // 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( maxDelta, float(${e.float(d.localConstrastAdaption)}) * delta.xy );
- return vec4( edges, 0.0, 0.0 );
- }
- void main() {
- gl_FragColor = EdgeDetectColorEdgeDetectionPS(fTexCoord, fOffset, tColor);
- }
- `),l}const s=Object.freeze(Object.defineProperty({__proto__:null,build:l},Symbol.toStringTag,{value:"Module"}));export{s as E,l as b};
|