import { TempNode } from 'three/webgpu'; import type { TSLFloatNode, TSLIntNode, TSLNodeFactory, TSLVec2Node, TSLVec4Node } from '../types/tsl.js'; /** Optional node inputs controlling the stable cinematic film effect. */ export interface FilmHDOptions { /** Grain strength, conventionally between zero and one. */ intensityNode?: TSLFloatNode | null; /** Spatial grain-density multiplier. */ grainScaleNode?: TSLFloatNode | null; /** Temporal grain-evolution speed. */ grainSpeedNode?: TSLFloatNode | null; /** Luminance response controlling how strongly shadows receive grain. */ grainResponseNode?: TSLFloatNode | null; /** Contrast multiplier applied to the generated grain. */ grainContrastNode?: TSLFloatNode | null; /** Blend amount for the optional scanline overlay. */ scanlineIntensityNode?: TSLFloatNode | null; /** Scanline frequency in display-space units. */ scanlineFrequencyNode?: TSLFloatNode | null; /** Blue-noise recursion level used by the grain generator. */ blueNoiseLevelNode?: TSLIntNode | null; /** Optional time input for deterministic or externally controlled animation. */ timeNode?: TSLFloatNode | null; /** Optional UV input replacing the default screen-space coordinates. */ uvNode?: TSLVec2Node | null; } export type FilmHDNodeFactory = TSLNodeFactory<[ inputNode: TSLVec4Node, options?: FilmHDOptions ], TSLVec4Node>; /** * High-definition film grain and scanline post-processing node. * @class FilmHDNode * @extends TempNode * @short Film-grain post node combining blue-noise grain and scanlines with temporal stability controls. * @category TSL * @private */ declare class FilmHDNode extends TempNode<'vec4'> { static get type(): string; /** * Create a film grain node. * @param {Node} inputNode Source color buffer. * @param {Object} [options={}] Optional configuration. * @param {Node} [options.intensityNode] Grain intensity [0..1]. * @param {Node} [options.grainScaleNode] Grain density multiplier. * @param {Node} [options.grainSpeedNode] Temporal evolution speed. * @param {Node} [options.grainResponseNode] Shadow weighting [0..1] (1=more grain in darks). * @param {Node} [options.grainContrastNode] Grain contrast multiplier. * @param {Node} [options.scanlineIntensityNode] Scanline blend amount [0..1]. * @param {Node} [options.scanlineFrequencyNode] Scanline frequency (lines per unit). * @param {Node} [options.blueNoiseLevelNode] Blue noise recursion level for quality. * @param {Node} [options.timeNode] Override time input for animation control. * @param {Node} [options.uvNode] Custom UV coordinates. */ inputNode: TSLVec4Node; intensityNode: TSLFloatNode | null; grainScaleNode: TSLFloatNode | null; grainSpeedNode: TSLFloatNode | null; grainResponseNode: TSLFloatNode | null; grainContrastNode: TSLFloatNode | null; scanlineIntensityNode: TSLFloatNode | null; scanlineFrequencyNode: TSLFloatNode | null; blueNoiseLevelNode: TSLIntNode | null; timeNode: TSLFloatNode | null; uvNode: TSLVec2Node | null; constructor(inputNode: TSLVec4Node, { intensityNode, grainScaleNode, grainSpeedNode, grainResponseNode, grainContrastNode, scanlineIntensityNode, scanlineFrequencyNode, blueNoiseLevelNode, timeNode, uvNode }?: FilmHDOptions); setup(): TSLVec4Node; } export default FilmHDNode; /** * Cinematic film grain with blue noise, scanlines, and temporal stability. * * **Features** * - Temporally stable grain (no flickering) using blue noise + white noise blend * - Shadow-weighted grain (more visible in darks via `grainResponseNode`) * - Animated scanlines for CRT/film look * - Frame interpolation for smooth temporal evolution * - Artist-friendly controls for all parameters * * **Algorithm** * - Blends blue noise (65%) + white noise (35%) for quality grain * - Per-frame jitter and rotation for temporal variation * - Luminance-based weighting (darks get more grain) * - Optional scanline overlay with sine wave * * ```js * import { filmHD } from 'three-blocks'; * import { pass, uniform } from 'three/tsl'; * * const scenePass = pass(scene, camera); * * const grainEffect = filmHD(scenePass, { * intensityNode: uniform(0.8), // Strong grain * grainScaleNode: uniform(1.5), // Fine grain * grainSpeedNode: uniform(12.0), // Moderate animation * grainResponseNode: uniform(0.85), // More grain in shadows * scanlineIntensityNode: uniform(0.075), // Subtle scanlines * scanlineFrequencyNode: uniform(900.0) * }); * * renderPipeline.outputNode = grainEffect; * ``` * * @function filmHD * @category TSL * @tags WebGPU, WebGL * @tsl * @param {Node} inputNode Source color buffer. * @param {Object} [options={}] Optional configuration nodes. * @param {Node} [options.intensityNode] Grain intensity [0..1] (default: 0.82). * @param {Node} [options.grainScaleNode] Grain density multiplier (default: 1.5). * @param {Node} [options.grainSpeedNode] Temporal evolution speed (default: 12.0). * @param {Node} [options.grainResponseNode] Shadow weighting [0..1] (default: 0.85). * @param {Node} [options.grainContrastNode] Grain contrast multiplier (default: 1.25). * @param {Node} [options.scanlineIntensityNode] Scanline blend amount [0..1] (default: 0.075). * @param {Node} [options.scanlineFrequencyNode] Scanline frequency (default: 900.0). * @param {Node} [options.blueNoiseLevelNode] Blue noise recursion level for quality. * @param {Node} [options.timeNode] Override time input for animation control. * @param {Node} [options.uvNode] Custom UV coordinates. * @returns {FilmHDNode} Film grain effect node. */ export declare const filmHD: FilmHDNodeFactory;