SSAAPassProxy.js

import Check from "@lijuhong1981/jscheck/src/Check.js";
import { Camera, Scene } from "three";
import SSAAPassNode, { ssaaPass } from 'three/addons/tsl/display/SSAAPassNode.js';
import { Node, TextureNode } from "three/webgpu";
import PassNodeProxy from "./PassNodeProxy.js";

/**
 * SSAAPassProxy是PassNodeProxy的一个子类,用于代理SSAA(超采样抗锯齿)后处理特效的Pass节点。
 * @class
 * @extends PassNodeProxy<SSAAPassNode>
*/
class SSAAPassProxy extends PassNodeProxy {
    constructor(library) {
        super(library);
        this._values = {
            sampleLevel: 2,
            unbiased: true,
        };
    }
    /**
     * The sample level specified  as n, where the number of samples is 2^n,
     * so sampleLevel = 4, is 2^4 samples, 16.
     *
     * @type {number}
     * @default 2
    */
    set sampleLevel(value) {
        Check.typeOf.number('sampleLevel', value);
        this._values.sampleLevel = value;
        this.node && (this.node.sampleLevel = value);
    }
    get sampleLevel() {
        return this._values.sampleLevel;
    }
    /**
     * Whether rounding errors should be mitigated or not.
     *
     * @type {boolean}
     * @default true
    */
    set unbiased(value) {
        Check.typeOf.boolean('unbiased', value);
        this._values.unbiased = value;
        this.node && (this.node.unbiased = value);
    }
    get unbiased() {
        return this._values.unbiased;
    }
    /**
     * 构建SSAA Pass节点。
     * @param {Scene} scene - 场景对象
     * @param {Camera} camera - 相机对象
     * @returns {SSAAPassNode} 构建出的节点对象
     * @override
    */
    build(scene, camera) {
        const ssaaPassNode = this.node = ssaaPass(scene, camera);
        this.setValues(this._values);
        // PassNode会在setup/update流程里依据options.samples重设renderTarget.samples。
        // 这里显式固定为0,确保SSAA内部depth copy两端采样数一致。
        // ssaaPassNode.options.samples = 0;
        // ssaaPassNode.renderTarget.samples = 0;
        ssaaPassNode.toInspector('SSAA');
        return ssaaPassNode;
    }
};

export default SSAAPassProxy;
export { SSAAPassProxy };