123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535 |
- module BABYLON {
- /**
- * Interface to follow in your material defines to integrate easily the
- * Image proccessing functions.
- */
- export interface IImageProcessingConfigurationDefines {
- IMAGEPROCESSING: boolean;
- VIGNETTE: boolean;
- VIGNETTEBLENDMODEMULTIPLY: boolean;
- VIGNETTEBLENDMODEOPAQUE: boolean;
- TONEMAPPING: boolean;
- CONTRAST: boolean;
- EXPOSURE: boolean;
- COLORCURVES: boolean;
- COLORGRADING: boolean;
- COLORGRADING3D: boolean;
- SAMPLER3DGREENDEPTH: boolean;
- SAMPLER3DBGRMAP: boolean;
- IMAGEPROCESSINGPOSTPROCESS: boolean;
- /**
- * If the grain should be performed in the image processing shader.
- */
- GRAIN: boolean;
- }
- /**
- * This groups together the common properties used for image processing either in direct forward pass
- * or through post processing effect depending on the use of the image processing pipeline in your scene
- * or not.
- */
- export class ImageProcessingConfiguration {
- /**
- * Color curves setup used in the effect if colorCurvesEnabled is set to true
- */
- @serializeAsColorCurves()
- public colorCurves: Nullable<ColorCurves> = new ColorCurves();
- @serialize()
- private _colorCurvesEnabled = false;
- /**
- * Gets wether the color curves effect is enabled.
- */
- public get colorCurvesEnabled(): boolean {
- return this._colorCurvesEnabled;
- }
- /**
- * Sets wether the color curves effect is enabled.
- */
- public set colorCurvesEnabled(value: boolean) {
- if (this._colorCurvesEnabled === value) {
- return;
- }
- this._colorCurvesEnabled = value;
- this._updateParameters();
- }
- /**
- * Color grading LUT texture used in the effect if colorGradingEnabled is set to true
- */
- @serializeAsTexture()
- public colorGradingTexture: Nullable<BaseTexture>;
- @serialize()
- private _colorGradingEnabled = false;
- /**
- * Gets wether the color grading effect is enabled.
- */
- public get colorGradingEnabled(): boolean {
- return this._colorGradingEnabled;
- }
- /**
- * Sets wether the color grading effect is enabled.
- */
- public set colorGradingEnabled(value: boolean) {
- if (this._colorGradingEnabled === value) {
- return;
- }
- this._colorGradingEnabled = value;
- this._updateParameters();
- }
- @serialize()
- private _colorGradingWithGreenDepth = true;
- /**
- * Gets wether the color grading effect is using a green depth for the 3d Texture.
- */
- public get colorGradingWithGreenDepth(): boolean {
- return this._colorGradingWithGreenDepth;
- }
- /**
- * Sets wether the color grading effect is using a green depth for the 3d Texture.
- */
- public set colorGradingWithGreenDepth(value: boolean) {
- if (this._colorGradingWithGreenDepth === value) {
- return;
- }
- this._colorGradingWithGreenDepth = value;
- this._updateParameters();
- }
- @serialize()
- private _colorGradingBGR = true;
- /**
- * Gets wether the color grading texture contains BGR values.
- */
- public get colorGradingBGR(): boolean {
- return this._colorGradingBGR;
- }
- /**
- * Sets wether the color grading texture contains BGR values.
- */
- public set colorGradingBGR(value: boolean) {
- if (this._colorGradingBGR === value) {
- return;
- }
- this._colorGradingBGR = value;
- this._updateParameters();
- }
- @serialize()
- public _exposure = 1.0;
- /**
- * Gets the Exposure used in the effect.
- */
- public get exposure(): number {
- return this._exposure;
- }
- /**
- * Sets the Exposure used in the effect.
- */
- public set exposure(value: number) {
- if (this._exposure === value) {
- return;
- }
- this._exposure = value;
- this._updateParameters();
- }
- @serialize()
- private _toneMappingEnabled = false;
- /**
- * Gets wether the tone mapping effect is enabled.
- */
- public get toneMappingEnabled(): boolean {
- return this._toneMappingEnabled;
- }
- /**
- * Sets wether the tone mapping effect is enabled.
- */
- public set toneMappingEnabled(value: boolean) {
- if (this._toneMappingEnabled === value) {
- return;
- }
- this._toneMappingEnabled = value;
- this._updateParameters();
- }
- @serialize()
- protected _contrast = 1.0;
- /**
- * Gets the contrast used in the effect.
- */
- public get contrast(): number {
- return this._contrast;
- }
- /**
- * Sets the contrast used in the effect.
- */
- public set contrast(value: number) {
- if (this._contrast === value) {
- return;
- }
- this._contrast = value;
- this._updateParameters();
- }
- /**
- * Vignette stretch size.
- */
- @serialize()
- public vignetteStretch = 0;
- /**
- * Vignette centre X Offset.
- */
- @serialize()
- public vignetteCentreX = 0;
- /**
- * Vignette centre Y Offset.
- */
- @serialize()
- public vignetteCentreY = 0;
- /**
- * Vignette weight or intensity of the vignette effect.
- */
- @serialize()
- public vignetteWeight = 1.5;
- /**
- * Color of the vignette applied on the screen through the chosen blend mode (vignetteBlendMode)
- * if vignetteEnabled is set to true.
- */
- @serializeAsColor4()
- public vignetteColor: Color4 = new Color4(0, 0, 0, 0);
- /**
- * Camera field of view used by the Vignette effect.
- */
- @serialize()
- public vignetteCameraFov = 0.5;
- @serialize()
- private _grainVarianceAmount = 0;
- /**
- * Amount of grain to be applied by the grain effect.
- */
- public get grainVarianceAmount(): number {
- return this._grainVarianceAmount;
- }
- public set grainVarianceAmount(value: number) {
- if (this._grainVarianceAmount === value) {
- return;
- }
- this._grainVarianceAmount = value;
- this._updateParameters();
- }
- @serialize()
- private _grainAnimated = false;
- /**
- * If the grain effect should be animated.
- */
- public get grainAnimated(): boolean {
- return this._grainAnimated;
- }
- public set grainAnimated(value: boolean) {
- if (this._grainAnimated === value) {
- return;
- }
- this._grainAnimated = value;
- this._updateParameters();
- }
- @serialize()
- private _vignetteBlendMode = ImageProcessingConfiguration.VIGNETTEMODE_MULTIPLY;
- /**
- * Gets the vignette blend mode allowing different kind of effect.
- */
- public get vignetteBlendMode(): number {
- return this._vignetteBlendMode;
- }
- /**
- * Sets the vignette blend mode allowing different kind of effect.
- */
- public set vignetteBlendMode(value: number) {
- if (this._vignetteBlendMode === value) {
- return;
- }
- this._vignetteBlendMode = value;
- this._updateParameters();
- }
- @serialize()
- private _vignetteEnabled = false;
- /**
- * Gets wether the vignette effect is enabled.
- */
- public get vignetteEnabled(): boolean {
- return this._vignetteEnabled;
- }
- /**
- * Sets wether the vignette effect is enabled.
- */
- public set vignetteEnabled(value: boolean) {
- if (this._vignetteEnabled === value) {
- return;
- }
- this._vignetteEnabled = value;
- this._updateParameters();
- }
- @serialize()
- private _applyByPostProcess = false;
- /**
- * Gets wether the image processing is applied through a post process or not.
- */
- public get applyByPostProcess(): boolean {
- return this._applyByPostProcess;
- }
- /**
- * Sets wether the image processing is applied through a post process or not.
- */
- public set applyByPostProcess(value: boolean) {
- if (this._applyByPostProcess === value) {
- return;
- }
- this._applyByPostProcess = value;
- this._updateParameters();
- }
- @serialize()
- private _isEnabled = true;
- /**
- * Gets wether the image processing is enabled or not.
- */
- public get isEnabled(): boolean {
- return this._isEnabled;
- }
- /**
- * Sets wether the image processing is enabled or not.
- */
- public set isEnabled(value: boolean) {
- if (this._isEnabled === value) {
- return;
- }
- this._isEnabled = value;
- this._updateParameters();
- }
- /**
- * An event triggered when the configuration changes and requires Shader to Update some parameters.
- * @type {BABYLON.Observable}
- */
- public onUpdateParameters = new Observable<ImageProcessingConfiguration>();
- /**
- * Method called each time the image processing information changes requires to recompile the effect.
- */
- protected _updateParameters(): void {
- this.onUpdateParameters.notifyObservers(this);
- }
- public getClassName(): string {
- return "ImageProcessingConfiguration";
- }
- /**
- * Prepare the list of uniforms associated with the Image Processing effects.
- * @param uniformsList The list of uniforms used in the effect
- * @param defines the list of defines currently in use
- */
- public static PrepareUniforms(uniforms: string[], defines: IImageProcessingConfigurationDefines): void {
- if (defines.EXPOSURE) {
- uniforms.push("exposureLinear");
- }
- if (defines.CONTRAST) {
- uniforms.push("contrast");
- }
- if (defines.COLORGRADING) {
- uniforms.push("colorTransformSettings");
- }
- if (defines.VIGNETTE) {
- uniforms.push("vInverseScreenSize");
- uniforms.push("vignetteSettings1");
- uniforms.push("vignetteSettings2");
- }
- if (defines.COLORCURVES) {
- ColorCurves.PrepareUniforms(uniforms);
- }
- if (defines.GRAIN){
- uniforms.push("grainVarianceAmount");
- uniforms.push("grainAnimatedSeed");
- }
- }
- /**
- * Prepare the list of samplers associated with the Image Processing effects.
- * @param uniformsList The list of uniforms used in the effect
- * @param defines the list of defines currently in use
- */
- public static PrepareSamplers(samplersList: string[], defines: IImageProcessingConfigurationDefines): void {
- if (defines.COLORGRADING) {
- samplersList.push("txColorTransform");
- }
- }
- /**
- * Prepare the list of defines associated to the shader.
- * @param defines the list of defines to complete
- */
- public prepareDefines(defines: IImageProcessingConfigurationDefines, forPostProcess: boolean = false): void {
- if (forPostProcess !== this.applyByPostProcess || !this._isEnabled) {
- defines.VIGNETTE = false;
- defines.TONEMAPPING = false;
- defines.CONTRAST = false;
- defines.EXPOSURE = false;
- defines.COLORCURVES = false;
- defines.COLORGRADING = false;
- defines.COLORGRADING3D = false;
- defines.IMAGEPROCESSING = false;
- defines.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess && this._isEnabled;
- return;
- }
- defines.VIGNETTE = this.vignetteEnabled;
- defines.VIGNETTEBLENDMODEMULTIPLY = (this.vignetteBlendMode === ImageProcessingConfiguration._VIGNETTEMODE_MULTIPLY);
- defines.VIGNETTEBLENDMODEOPAQUE = !defines.VIGNETTEBLENDMODEMULTIPLY;
- defines.TONEMAPPING = this.toneMappingEnabled;
- defines.CONTRAST = (this.contrast !== 1.0);
- defines.EXPOSURE = (this.exposure !== 1.0);
- defines.COLORCURVES = (this.colorCurvesEnabled && !!this.colorCurves);
- defines.COLORGRADING = (this.colorGradingEnabled && !!this.colorGradingTexture);
- if (defines.COLORGRADING) {
- defines.COLORGRADING3D = this.colorGradingTexture!.is3D;
- } else {
- defines.COLORGRADING3D = false;
- }
- defines.SAMPLER3DGREENDEPTH = this.colorGradingWithGreenDepth;
- defines.SAMPLER3DBGRMAP = this.colorGradingBGR;
- defines.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess;
- defines.IMAGEPROCESSING = defines.VIGNETTE || defines.TONEMAPPING || defines.CONTRAST || defines.EXPOSURE || defines.COLORCURVES || defines.COLORGRADING;
- defines.GRAIN = (this.grainVarianceAmount != 0.0);
- }
- /**
- * Returns true if all the image processing information are ready.
- */
- public isReady() {
- // Color Grading texure can not be none blocking.
- return !this.colorGradingEnabled || !this.colorGradingTexture || this.colorGradingTexture.isReady();
- }
- /**
- * Binds the image processing to the shader.
- * @param effect The effect to bind to
- */
- public bind(effect: Effect, aspectRatio = 1): void {
- // Color Curves
- if (this._colorCurvesEnabled && this.colorCurves) {
- ColorCurves.Bind(this.colorCurves, effect);
- }
- // Vignette
- if (this._vignetteEnabled) {
- var inverseWidth = 1 / effect.getEngine().getRenderWidth();
- var inverseHeight = 1 / effect.getEngine().getRenderHeight();
- effect.setFloat2("vInverseScreenSize", inverseWidth, inverseHeight);
- let vignetteScaleY = Math.tan(this.vignetteCameraFov * 0.5);
- let vignetteScaleX = vignetteScaleY * aspectRatio;
- let vignetteScaleGeometricMean = Math.sqrt(vignetteScaleX * vignetteScaleY);
- vignetteScaleX = Tools.Mix(vignetteScaleX, vignetteScaleGeometricMean, this.vignetteStretch);
- vignetteScaleY = Tools.Mix(vignetteScaleY, vignetteScaleGeometricMean, this.vignetteStretch);
- effect.setFloat4("vignetteSettings1", vignetteScaleX, vignetteScaleY, -vignetteScaleX * this.vignetteCentreX, -vignetteScaleY * this.vignetteCentreY);
- let vignettePower = -2.0 * this.vignetteWeight;
- effect.setFloat4("vignetteSettings2", this.vignetteColor.r, this.vignetteColor.g, this.vignetteColor.b, vignettePower);
- }
- // Exposure
- effect.setFloat("exposureLinear", this.exposure);
- // Contrast
- effect.setFloat("contrast", this.contrast);
- // Color transform settings
- if (this.colorGradingTexture) {
- effect.setTexture("txColorTransform", this.colorGradingTexture);
- let textureSize = this.colorGradingTexture.getSize().height;
- effect.setFloat4("colorTransformSettings",
- (textureSize - 1) / textureSize, // textureScale
- 0.5 / textureSize, // textureOffset
- textureSize, // textureSize
- this.colorGradingTexture.level // weight
- );
- }
- effect.setFloat("grainVarianceAmount", this.grainVarianceAmount);
- effect.setFloat("grainAnimatedSeed", this.grainAnimated ? Math.random() : 1);
- }
- /**
- * Clones the current image processing instance.
- * @return The cloned image processing
- */
- public clone(): ImageProcessingConfiguration {
- return SerializationHelper.Clone(() => new ImageProcessingConfiguration(), this);
- }
- /**
- * Serializes the current image processing instance to a json representation.
- * @return a JSON representation
- */
- public serialize(): any {
- return SerializationHelper.Serialize(this);
- }
- /**
- * Parses the image processing from a json representation.
- * @param source the JSON source to parse
- * @return The parsed image processing
- */
- public static Parse(source: any): ImageProcessingConfiguration {
- return SerializationHelper.Parse(() => new ImageProcessingConfiguration(), source, null, null);
- }
- // Static constants associated to the image processing.
- private static _VIGNETTEMODE_MULTIPLY = 0;
- private static _VIGNETTEMODE_OPAQUE = 1;
- /**
- * Used to apply the vignette as a mix with the pixel color.
- */
- public static get VIGNETTEMODE_MULTIPLY(): number {
- return this._VIGNETTEMODE_MULTIPLY;
- }
- /**
- * Used to apply the vignette as a replacement of the pixel color.
- */
- public static get VIGNETTEMODE_OPAQUE(): number {
- return this._VIGNETTEMODE_OPAQUE;
- }
- }
- }
|