constructor( textureNode ) {

		super( 'vec4' );

		/**
		 * The texture node that represents the input of the effect.
		 *
		 * @type {TextureNode}
		 */
		this.textureNode = textureNode;

		/**
		 * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
		 * its effect once per frame in `updateBefore()`.
		 *
		 * @type {string}
		 * @default 'frame'
		 */
		this.updateBeforeType = NodeUpdateType.FRAME;

		/**
		 * The render target used for the edges pass.
		 *
		 * @private
		 * @type {RenderTarget}
		 */
		this._renderTargetEdges = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
		this._renderTargetEdges.texture.name = 'SMAANode.edges';

		/**
		 * The render target used for the weights pass.
		 *
		 * @private
		 * @type {RenderTarget}
		 */
		this._renderTargetWeights = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
		this._renderTargetWeights.texture.name = 'SMAANode.weights';

		/**
		 * The render target used for the blend pass.
		 *
		 * @private
		 * @type {RenderTarget}
		 */
		this._renderTargetBlend = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
		this._renderTargetBlend.texture.name = 'SMAANode.blend';

		// textures

		const scope = this;

		const areaTextureImage = new Image();
		areaTextureImage.src = this._getAreaTexture();
		areaTextureImage.onload = function () {

			// assigning data to HTMLImageElement.src is asynchronous (see #15162)
			scope._areaTexture.needsUpdate = true;

		};

		/**
		 * Represents the "area" texture used by the SMAA implementation.
		 *
		 * @private
		 * @type {RenderTarget}
		 */
		this._areaTexture = new Texture();
		this._areaTexture.name = 'SMAANode.area';
		this._areaTexture.image = areaTextureImage;
		this._areaTexture.minFilter = LinearFilter;
		this._areaTexture.generateMipmaps = false;
		this._areaTexture.flipY = false;

		const searchTextureImage = new Image();
		searchTextureImage.src = this._getSearchTexture();
		searchTextureImage.onload = function () {

			// assigning data to HTMLImageElement.src is asynchronous (see #15162)
			scope._searchTexture.needsUpdate = true;

		};

		/**
		 * Represents the "search" texture used by the SMAA implementation.
		 *
		 * @private
		 * @type {RenderTarget}
		 */
		this._searchTexture = new Texture();
		this._searchTexture.name = 'SMAANode.search';
		this._searchTexture.image = searchTextureImage;
		this._searchTexture.magFilter = NearestFilter;
		this._searchTexture.minFilter = NearestFilter;
		this._searchTexture.generateMipmaps = false;
		this._searchTexture.flipY = false;

		/**
		 * A uniform node holding the inverse resolution value.
		 *
		 * @private
		 * @type {UniformNode<vec2>}
		 */
		this._invSize = uniform( new Vector2() );

		/**
		 * A uniform texture node holding the area texture.
		 *
		 * @private
		 * @type {TextureNode}
		 */
		this._areaTextureUniform = texture( this._areaTexture );

		/**
		 * A uniform texture node holding the search texture.
		 *
		 * @private
		 * @type {TextureNode}
		 */
		this._searchTextureUniform = texture( this._searchTexture );

		/**
		 * A uniform texture node representing the edges pass.
		 *
		 * @private
		 * @type {TextureNode}
		 */
		this._edgesTextureUniform = texture( this._renderTargetEdges.texture );

		/**
		 * A uniform texture node representing the weights pass.
		 *
		 * @private
		 * @type {TextureNode}
		 */
		this._weightsTextureUniform = texture( this._renderTargetWeights.texture );

		/**
		 * The node material that holds the TSL for rendering the edges pass.
		 *
		 * @private
		 * @type {NodeMaterial}
		 */
		this._materialEdges = new NodeMaterial();
		this._materialEdges.name = 'SMAANode.edges';

		/**
		 * The node material that holds the TSL for rendering the weights pass.
		 *
		 * @private
		 * @type {NodeMaterial}
		 */
		this._materialWeights = new NodeMaterial();
		this._materialWeights.name = 'SMAANode.weights';

		/**
		 * The node material that holds the TSL for rendering the blend pass.
		 *
		 * @private
		 * @type {NodeMaterial}
		 */
		this._materialBlend = new NodeMaterial();
		this._materialBlend.name = 'SMAANode.blend';

		/**
		 * The result of the effect is represented as a separate texture node.
		 *
		 * @private
		 * @type {PassTextureNode}
		 */
		this._textureNode = passTexture( this, this._renderTargetBlend.texture );

	}
Constructs a new SMAA node.

@param {TextureNode} textureNode - The texture node that represents the input of the effect.