export type Vec3 = readonly [number, number, number];
export interface PbrDirectLightInput {
    readonly normal: Vec3;
    readonly viewDirection: Vec3;
    readonly lightDirection: Vec3;
    readonly lightColor: Vec3;
    readonly lightIntensity: number;
    readonly albedo: Vec3;
    readonly metallic: number;
    readonly roughness: number;
    readonly specularFactor?: number;
    readonly specularColorFactor?: Vec3;
}
export interface PbrEnvironmentLightInput {
    readonly normal: Vec3;
    readonly viewDirection: Vec3;
    readonly diffuseIrradiance: Vec3;
    readonly specularRadiance: Vec3;
    readonly albedo: Vec3;
    readonly metallic: number;
    readonly roughness: number;
    readonly specularFactor?: number;
    readonly specularColorFactor?: Vec3;
}
export type PbrPhotometricConformanceCategory = "direct-material-response" | "environment-response" | "fresnel-response" | "specular-extension-response" | "caustics-response";
export interface PbrPhotometricConformanceSample {
    readonly id: string;
    readonly category: PbrPhotometricConformanceCategory;
    readonly rgb: Vec3;
    readonly luminance: number;
}
export interface PbrPhotometricConformanceCheck {
    readonly id: string;
    readonly passed: boolean;
    readonly metric: number;
    readonly threshold: number;
}
export interface PbrPhotometricConformanceReport {
    readonly ok: boolean;
    readonly samples: readonly PbrPhotometricConformanceSample[];
    readonly checks: readonly PbrPhotometricConformanceCheck[];
    readonly metrics: {
        readonly sampleCount: number;
        readonly checkCount: number;
        readonly failedCheckCount: number;
        readonly finiteNonNegativeSamples: number;
        readonly directRoughnessDelta: number;
        readonly directMetalDielectricDelta: number;
        readonly environmentMetalDielectricDelta: number;
        readonly grazingFresnelGain: number;
        readonly specularFactorGain: number;
        readonly specularTintRedBias: number;
        readonly irradianceGain: number;
    };
}
export interface PbrTransmissionVolumeInput {
    readonly baseColor: Vec3;
    readonly transmissionFactor?: number;
    readonly diffuseTransmissionFactor?: number;
    readonly diffuseTransmissionColorFactor?: Vec3;
    readonly transmissionFallbackEnergy?: number;
    readonly volumeThicknessFactor?: number;
    readonly volumeAttenuationDistance?: number;
    readonly volumeAttenuationColor?: Vec3;
    readonly ior?: number;
    readonly specularFactor?: number;
    readonly specularColorFactor?: Vec3;
    readonly dispersion?: number;
}
export interface PbrTransmissionVolumeResponse {
    readonly color: Vec3;
    readonly transmitted: Vec3;
    readonly volumeAttenuation: Vec3;
    readonly dispersionTint: Vec3;
    readonly specularLobe: Vec3;
    readonly luminance: number;
}
export interface PbrTransmissionVolumeConformanceReport {
    readonly ok: boolean;
    readonly samples: readonly PbrPhotometricConformanceSample[];
    readonly checks: readonly PbrPhotometricConformanceCheck[];
    readonly metrics: {
        readonly sampleCount: number;
        readonly checkCount: number;
        readonly failedCheckCount: number;
        readonly finiteNonNegativeSamples: number;
        readonly thickGlassAttenuationLoss: number;
        readonly attenuationBlueBias: number;
        readonly diffuseTransmissionGreenBias: number;
        readonly iorSpecularGain: number;
        readonly dispersionRedBlueSpread: number;
    };
}
export interface PbrCausticsTransmissionInput {
    readonly incidentColor: Vec3;
    readonly transmittedColor: Vec3;
    readonly ior: number;
    readonly curvature: number;
    readonly thickness: number;
    readonly roughness: number;
    readonly receiverDistance: number;
    readonly attenuationDistance?: number;
    readonly attenuationColor?: Vec3;
    readonly dispersion?: number;
}
export interface PbrCausticsTransmissionResponse {
    readonly color: Vec3;
    readonly attenuation: Vec3;
    readonly dispersionTint: Vec3;
    readonly footprintRadius: number;
    readonly focusStrength: number;
    readonly peakIntensity: number;
    readonly luminance: number;
}
export interface PbrCausticsConformanceReport {
    readonly ok: boolean;
    readonly samples: readonly PbrPhotometricConformanceSample[];
    readonly checks: readonly PbrPhotometricConformanceCheck[];
    readonly metrics: {
        readonly sampleCount: number;
        readonly checkCount: number;
        readonly failedCheckCount: number;
        readonly finiteNonNegativeSamples: number;
        readonly focusedPeakGain: number;
        readonly roughnessPeakLoss: number;
        readonly focusedFootprintContraction: number;
        readonly attenuationRedBias: number;
        readonly dispersionRedBlueSpread: number;
    };
}
export declare const PBR_REFERENCE_PI: number;
export declare const PBR_REFERENCE_INV_PI: number;
export declare const PBR_REFERENCE_EPSILON = 0.00001;
export declare const PBR_REFERENCE_MIN_ROUGHNESS = 0.045;
export declare function pbrSaturate(value: number): number;
export declare function pbrFresnelSchlick(f0: Vec3, vDotH: number): Vec3;
export declare function pbrFresnelSchlickSpecular(f0: Vec3, vDotH: number, specularFactor: number): Vec3;
export declare function pbrFresnelSchlickRoughness(f0: Vec3, nDotV: number, roughness: number): Vec3;
export declare function pbrFresnelSchlickRoughnessSpecular(f0: Vec3, nDotV: number, roughness: number, specularFactor: number): Vec3;
export declare function pbrDistributionGgx(nDotH: number, roughness: number): number;
export declare function pbrGeometrySmithGgxCorrelated(nDotV: number, nDotL: number, roughness: number): number;
export declare function pbrDiffuseBurley(nDotV: number, nDotL: number, lDotH: number, roughness: number): number;
export declare function pbrF0(albedo: Vec3, metallic: number, specularFactor?: number, specularColorFactor?: Vec3): Vec3;
export declare function pbrDirectLight(input: PbrDirectLightInput): Vec3;
export declare function pbrEnvironmentLight(input: PbrEnvironmentLightInput): Vec3;
export declare function pbrReferenceLuminance(value: Vec3): number;
export declare function pbrReferenceFinite(value: Vec3): boolean;
export declare function pbrPhotometricConformanceSuite(): PbrPhotometricConformanceReport;
export declare function pbrTransmissionVolumeResponse(input: PbrTransmissionVolumeInput): PbrTransmissionVolumeResponse;
export declare function pbrTransmissionVolumeConformanceSuite(): PbrTransmissionVolumeConformanceReport;
export declare function pbrCausticsTransmissionResponse(input: PbrCausticsTransmissionInput): PbrCausticsTransmissionResponse;
export declare function pbrCausticsConformanceSuite(): PbrCausticsConformanceReport;
//# sourceMappingURL=PbrReference.d.ts.map