@babylonjs/core 8.15.0 → 8.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Animations/animatable.core.d.ts +6 -0
- package/Animations/animatable.core.js +7 -1
- package/Animations/animatable.core.js.map +1 -1
- package/AudioV2/webAudio/webAudioStaticSound.d.ts +1 -0
- package/AudioV2/webAudio/webAudioStaticSound.js +4 -1
- package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Gizmos/boundingBoxGizmo.js +2 -0
- package/Gizmos/boundingBoxGizmo.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +4 -4
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.d.ts +71 -0
- package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.js +156 -0
- package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.js.map +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.d.ts +12 -0
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js +57 -3
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js.map +1 -1
- package/PostProcesses/thinTAAPostProcess.d.ts +17 -0
- package/PostProcesses/thinTAAPostProcess.js +51 -0
- package/PostProcesses/thinTAAPostProcess.js.map +1 -1
- package/Shaders/taa.fragment.js +15 -1
- package/Shaders/taa.fragment.js.map +1 -1
- package/ShadersWGSL/taa.fragment.js +16 -2
- package/ShadersWGSL/taa.fragment.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { Material } from "../../../Materials/material.js";
|
|
2
|
+
import { MaterialDefines } from "../../../Materials/materialDefines.js";
|
|
3
|
+
import { MaterialPluginBase } from "../../../Materials/materialPluginBase.js";
|
|
4
|
+
import { ShaderLanguage } from "../../../Materials/shaderLanguage.js";
|
|
5
|
+
import type { UniformBuffer } from "../../../Materials/uniformBuffer.js";
|
|
6
|
+
import { Vector2 } from "../../../Maths/math.vector.js";
|
|
7
|
+
import type { Scene } from "../../../scene.js";
|
|
8
|
+
import type { Nullable } from "../../../types.js";
|
|
9
|
+
declare class TAAJitterMaterialDefines extends MaterialDefines {
|
|
10
|
+
TAA_JITTER: boolean;
|
|
11
|
+
}
|
|
12
|
+
declare class TAAJitterMaterialPlugin extends MaterialPluginBase {
|
|
13
|
+
static readonly Name = "TAAJitter";
|
|
14
|
+
private _manager;
|
|
15
|
+
get manager(): Nullable<TAAMaterialManager>;
|
|
16
|
+
set manager(manager: Nullable<TAAMaterialManager>);
|
|
17
|
+
get isEnabled(): boolean;
|
|
18
|
+
constructor(material: Material);
|
|
19
|
+
/** @internal */
|
|
20
|
+
_updateMaterial(): void;
|
|
21
|
+
isCompatible(): boolean;
|
|
22
|
+
getClassName(): string;
|
|
23
|
+
prepareDefines(defines: TAAJitterMaterialDefines): void;
|
|
24
|
+
getUniforms(shaderLanguage?: ShaderLanguage): {
|
|
25
|
+
ubo: {
|
|
26
|
+
name: string;
|
|
27
|
+
size: number;
|
|
28
|
+
type: string;
|
|
29
|
+
}[];
|
|
30
|
+
vertex: string;
|
|
31
|
+
} | {
|
|
32
|
+
ubo: {
|
|
33
|
+
name: string;
|
|
34
|
+
size: number;
|
|
35
|
+
type: string;
|
|
36
|
+
}[];
|
|
37
|
+
vertex?: undefined;
|
|
38
|
+
};
|
|
39
|
+
hardBindForSubMesh(uniformBuffer: UniformBuffer): void;
|
|
40
|
+
getCustomCode(shaderType: string, shaderLanguage?: ShaderLanguage): {
|
|
41
|
+
CUSTOM_VERTEX_MAIN_END: string;
|
|
42
|
+
} | null;
|
|
43
|
+
dispose(): void;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Applies and manages the TAA jitter plugin on all materials.
|
|
47
|
+
*/
|
|
48
|
+
export declare class TAAMaterialManager {
|
|
49
|
+
private _isEnabled;
|
|
50
|
+
/**
|
|
51
|
+
* Set to enable or disable the jitter offset on all materials.
|
|
52
|
+
*/
|
|
53
|
+
get isEnabled(): boolean;
|
|
54
|
+
set isEnabled(enabled: boolean);
|
|
55
|
+
/**
|
|
56
|
+
* The current jitter offset to apply to all materials.
|
|
57
|
+
*/
|
|
58
|
+
readonly jitter: Vector2;
|
|
59
|
+
/** @internal */
|
|
60
|
+
readonly _materialPlugins: TAAJitterMaterialPlugin[];
|
|
61
|
+
/**
|
|
62
|
+
* @param scene All materials in this scene will have a jitter offset applied to them.
|
|
63
|
+
*/
|
|
64
|
+
constructor(scene: Scene);
|
|
65
|
+
/**
|
|
66
|
+
* Disposes of the material manager.
|
|
67
|
+
*/
|
|
68
|
+
dispose(): void;
|
|
69
|
+
private _getPlugin;
|
|
70
|
+
}
|
|
71
|
+
export {};
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { MaterialDefines } from "../../../Materials/materialDefines.js";
|
|
2
|
+
import { MaterialPluginBase } from "../../../Materials/materialPluginBase.js";
|
|
3
|
+
import { RegisterMaterialPlugin, UnregisterMaterialPlugin } from "../../../Materials/materialPluginManager.js";
|
|
4
|
+
import { Vector2 } from "../../../Maths/math.vector.js";
|
|
5
|
+
class TAAJitterMaterialDefines extends MaterialDefines {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
this.TAA_JITTER = false;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
class TAAJitterMaterialPlugin extends MaterialPluginBase {
|
|
12
|
+
get manager() {
|
|
13
|
+
return this._manager;
|
|
14
|
+
}
|
|
15
|
+
set manager(manager) {
|
|
16
|
+
if (this._manager === manager) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
this.dispose();
|
|
20
|
+
this._manager = manager;
|
|
21
|
+
manager?._materialPlugins.push(this);
|
|
22
|
+
this._updateMaterial();
|
|
23
|
+
}
|
|
24
|
+
get isEnabled() {
|
|
25
|
+
return this._manager?.isEnabled ?? false;
|
|
26
|
+
}
|
|
27
|
+
constructor(material) {
|
|
28
|
+
super(material, TAAJitterMaterialPlugin.Name, 300, new TAAJitterMaterialDefines());
|
|
29
|
+
this.registerForExtraEvents = true;
|
|
30
|
+
}
|
|
31
|
+
/** @internal */
|
|
32
|
+
_updateMaterial() {
|
|
33
|
+
this._enable(this.isEnabled);
|
|
34
|
+
this.markAllDefinesAsDirty();
|
|
35
|
+
}
|
|
36
|
+
isCompatible() {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
getClassName() {
|
|
40
|
+
return "TAAJitterMaterialPlugin";
|
|
41
|
+
}
|
|
42
|
+
prepareDefines(defines) {
|
|
43
|
+
defines.TAA_JITTER = this.isEnabled;
|
|
44
|
+
}
|
|
45
|
+
getUniforms(shaderLanguage = 0 /* ShaderLanguage.GLSL */) {
|
|
46
|
+
const ubo = [{ name: "taa_jitter", size: 2, type: "vec2" }];
|
|
47
|
+
if (shaderLanguage === 0 /* ShaderLanguage.GLSL */) {
|
|
48
|
+
return {
|
|
49
|
+
ubo,
|
|
50
|
+
vertex: `
|
|
51
|
+
#ifdef TAA_JITTER
|
|
52
|
+
uniform vec2 taa_jitter;
|
|
53
|
+
#endif
|
|
54
|
+
`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
return { ubo };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
hardBindForSubMesh(uniformBuffer) {
|
|
62
|
+
if (this.isEnabled) {
|
|
63
|
+
const jitter = this._manager.jitter;
|
|
64
|
+
uniformBuffer.updateFloat2("taa_jitter", jitter.x, jitter.y);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
getCustomCode(shaderType, shaderLanguage = 0 /* ShaderLanguage.GLSL */) {
|
|
68
|
+
// We jitter instead of modifying the camera so the velocity buffer stays unaffected
|
|
69
|
+
// More info: https://sugulee.wordpress.com/2021/06/21/temporal-anti-aliasingtaa-tutorial/
|
|
70
|
+
if (shaderType !== "vertex") {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
else if (shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
74
|
+
return {
|
|
75
|
+
CUSTOM_VERTEX_MAIN_END: `
|
|
76
|
+
#ifdef TAA_JITTER
|
|
77
|
+
vertexOutputs.position += vec4f(uniforms.taa_jitter * vertexOutputs.position.w, 0, 1);
|
|
78
|
+
#endif
|
|
79
|
+
`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
return {
|
|
84
|
+
CUSTOM_VERTEX_MAIN_END: `
|
|
85
|
+
#ifdef TAA_JITTER
|
|
86
|
+
gl_Position.xy += taa_jitter * gl_Position.w;
|
|
87
|
+
#endif
|
|
88
|
+
`,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
dispose() {
|
|
93
|
+
if (this._manager) {
|
|
94
|
+
const index = this._manager._materialPlugins.indexOf(this);
|
|
95
|
+
if (index !== -1) {
|
|
96
|
+
this._manager._materialPlugins.splice(index, 1);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
TAAJitterMaterialPlugin.Name = "TAAJitter";
|
|
102
|
+
/**
|
|
103
|
+
* Applies and manages the TAA jitter plugin on all materials.
|
|
104
|
+
*/
|
|
105
|
+
export class TAAMaterialManager {
|
|
106
|
+
/**
|
|
107
|
+
* Set to enable or disable the jitter offset on all materials.
|
|
108
|
+
*/
|
|
109
|
+
get isEnabled() {
|
|
110
|
+
return this._isEnabled;
|
|
111
|
+
}
|
|
112
|
+
set isEnabled(enabled) {
|
|
113
|
+
if (this._isEnabled === enabled) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
this._isEnabled = enabled;
|
|
117
|
+
for (const plugin of this._materialPlugins) {
|
|
118
|
+
plugin._updateMaterial();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* @param scene All materials in this scene will have a jitter offset applied to them.
|
|
123
|
+
*/
|
|
124
|
+
constructor(scene) {
|
|
125
|
+
this._isEnabled = true;
|
|
126
|
+
/**
|
|
127
|
+
* The current jitter offset to apply to all materials.
|
|
128
|
+
*/
|
|
129
|
+
this.jitter = new Vector2();
|
|
130
|
+
/** @internal */
|
|
131
|
+
this._materialPlugins = [];
|
|
132
|
+
for (const material of scene.materials) {
|
|
133
|
+
this._getPlugin(material);
|
|
134
|
+
}
|
|
135
|
+
RegisterMaterialPlugin(TAAJitterMaterialPlugin.Name, (material) => this._getPlugin(material));
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Disposes of the material manager.
|
|
139
|
+
*/
|
|
140
|
+
dispose() {
|
|
141
|
+
UnregisterMaterialPlugin(TAAJitterMaterialPlugin.Name);
|
|
142
|
+
const plugins = this._materialPlugins.splice(0, this._materialPlugins.length);
|
|
143
|
+
for (const plugin of plugins) {
|
|
144
|
+
plugin.manager = null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
_getPlugin(material) {
|
|
148
|
+
let plugin = material.pluginManager?.getPlugin(TAAJitterMaterialPlugin.Name);
|
|
149
|
+
if (!plugin) {
|
|
150
|
+
plugin = new TAAJitterMaterialPlugin(material);
|
|
151
|
+
}
|
|
152
|
+
plugin.manager = this;
|
|
153
|
+
return plugin;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=taaMaterialManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taaMaterialManager.js","sourceRoot":"","sources":["../../../../../../dev/core/src/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,8CAAuC;AACjE,OAAO,EAAE,kBAAkB,EAAE,iDAA0C;AACvE,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,oDAA6C;AAGxG,OAAO,EAAE,OAAO,EAAE,sCAA+B;AAIjD,MAAM,wBAAyB,SAAQ,eAAe;IAAtD;;QACI,eAAU,GAAG,KAAK,CAAC;IACvB,CAAC;CAAA;AAED,MAAM,uBAAwB,SAAQ,kBAAkB;IAIpD,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAW,OAAO,CAAC,OAAqC;QACpD,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC5B,OAAO;QACX,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,OAAO,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,QAAQ,EAAE,SAAS,IAAI,KAAK,CAAC;IAC7C,CAAC;IAED,YAAY,QAAkB;QAC1B,KAAK,CAAC,QAAQ,EAAE,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,wBAAwB,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;IACvC,CAAC;IAED,gBAAgB;IACT,eAAe;QAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACjC,CAAC;IAEe,YAAY;QACxB,OAAO,IAAI,CAAC;IAChB,CAAC;IAEe,YAAY;QACxB,OAAO,yBAAyB,CAAC;IACrC,CAAC;IAEe,cAAc,CAAC,OAAiC;QAC5D,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;IACxC,CAAC;IAEe,WAAW,CAAC,cAAc,8BAAsB;QAC5D,MAAM,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5D,IAAI,cAAc,gCAAwB,EAAE,CAAC;YACzC,OAAO;gBACH,GAAG;gBACH,MAAM,EAAE;;;;iBAIP;aACJ,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,OAAO,EAAE,GAAG,EAAE,CAAC;QACnB,CAAC;IACL,CAAC;IAEe,kBAAkB,CAAC,aAA4B;QAC3D,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAS,CAAC,MAAM,CAAC;YACrC,aAAa,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;IACL,CAAC;IAEe,aAAa,CAAC,UAAkB,EAAE,cAAc,8BAAsB;QAClF,oFAAoF;QACpF,0FAA0F;QAC1F,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,cAAc,gCAAwB,EAAE,CAAC;YAChD,OAAO;gBACH,sBAAsB,EAAE;;;;iBAIvB;aACJ,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,OAAO;gBACH,sBAAsB,EAAE;;;;iBAIvB;aACJ,CAAC;QACN,CAAC;IACL,CAAC;IAEe,OAAO;QACnB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpD,CAAC;QACL,CAAC;IACL,CAAC;;AAlGsB,4BAAI,GAAG,WAAW,CAAC;AAqG9C;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAE3B;;OAEG;IACH,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,IAAW,SAAS,CAAC,OAAgB;QACjC,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;YAC9B,OAAO;QACX,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;QAC1B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACzC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAUD;;OAEG;IACH,YAAY,KAAY;QA7BhB,eAAU,GAAG,IAAI,CAAC;QAkB1B;;WAEG;QACa,WAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAEvC,gBAAgB;QACA,qBAAgB,GAA8B,EAAE,CAAC;QAM7D,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QACD,sBAAsB,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClG,CAAC;IAED;;OAEG;IACI,OAAO;QACV,wBAAwB,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC9E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,CAAC;IACL,CAAC;IAEO,UAAU,CAAC,QAAkB;QACjC,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,EAAE,SAAS,CAA0B,uBAAuB,CAAC,IAAI,CAAC,CAAC;QACtG,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,GAAG,IAAI,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ","sourcesContent":["import type { Material } from \"core/Materials/material\";\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\nimport { RegisterMaterialPlugin, UnregisterMaterialPlugin } from \"core/Materials/materialPluginManager\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\nimport { Vector2 } from \"core/Maths/math.vector\";\nimport type { Scene } from \"core/scene\";\nimport type { Nullable } from \"core/types\";\n\nclass TAAJitterMaterialDefines extends MaterialDefines {\n TAA_JITTER = false;\n}\n\nclass TAAJitterMaterialPlugin extends MaterialPluginBase {\n public static readonly Name = \"TAAJitter\";\n\n private _manager: Nullable<TAAMaterialManager>;\n public get manager(): Nullable<TAAMaterialManager> {\n return this._manager;\n }\n\n public set manager(manager: Nullable<TAAMaterialManager>) {\n if (this._manager === manager) {\n return;\n }\n this.dispose();\n this._manager = manager;\n manager?._materialPlugins.push(this);\n this._updateMaterial();\n }\n\n public get isEnabled(): boolean {\n return this._manager?.isEnabled ?? false;\n }\n\n constructor(material: Material) {\n super(material, TAAJitterMaterialPlugin.Name, 300, new TAAJitterMaterialDefines());\n this.registerForExtraEvents = true;\n }\n\n /** @internal */\n public _updateMaterial(): void {\n this._enable(this.isEnabled);\n this.markAllDefinesAsDirty();\n }\n\n public override isCompatible(): boolean {\n return true;\n }\n\n public override getClassName(): string {\n return \"TAAJitterMaterialPlugin\";\n }\n\n public override prepareDefines(defines: TAAJitterMaterialDefines): void {\n defines.TAA_JITTER = this.isEnabled;\n }\n\n public override getUniforms(shaderLanguage = ShaderLanguage.GLSL) {\n const ubo = [{ name: \"taa_jitter\", size: 2, type: \"vec2\" }];\n if (shaderLanguage === ShaderLanguage.GLSL) {\n return {\n ubo,\n vertex: `\n #ifdef TAA_JITTER\n uniform vec2 taa_jitter;\n #endif\n `,\n };\n } else {\n return { ubo };\n }\n }\n\n public override hardBindForSubMesh(uniformBuffer: UniformBuffer): void {\n if (this.isEnabled) {\n const jitter = this._manager!.jitter;\n uniformBuffer.updateFloat2(\"taa_jitter\", jitter.x, jitter.y);\n }\n }\n\n public override getCustomCode(shaderType: string, shaderLanguage = ShaderLanguage.GLSL) {\n // We jitter instead of modifying the camera so the velocity buffer stays unaffected\n // More info: https://sugulee.wordpress.com/2021/06/21/temporal-anti-aliasingtaa-tutorial/\n if (shaderType !== \"vertex\") {\n return null;\n } else if (shaderLanguage === ShaderLanguage.WGSL) {\n return {\n CUSTOM_VERTEX_MAIN_END: `\n #ifdef TAA_JITTER\n vertexOutputs.position += vec4f(uniforms.taa_jitter * vertexOutputs.position.w, 0, 1);\n #endif\n `,\n };\n } else {\n return {\n CUSTOM_VERTEX_MAIN_END: `\n #ifdef TAA_JITTER\n gl_Position.xy += taa_jitter * gl_Position.w;\n #endif\n `,\n };\n }\n }\n\n public override dispose(): void {\n if (this._manager) {\n const index = this._manager._materialPlugins.indexOf(this);\n if (index !== -1) {\n this._manager._materialPlugins.splice(index, 1);\n }\n }\n }\n}\n\n/**\n * Applies and manages the TAA jitter plugin on all materials.\n */\nexport class TAAMaterialManager {\n private _isEnabled = true;\n /**\n * Set to enable or disable the jitter offset on all materials.\n */\n public get isEnabled(): boolean {\n return this._isEnabled;\n }\n\n public set isEnabled(enabled: boolean) {\n if (this._isEnabled === enabled) {\n return;\n }\n this._isEnabled = enabled;\n for (const plugin of this._materialPlugins) {\n plugin._updateMaterial();\n }\n }\n\n /**\n * The current jitter offset to apply to all materials.\n */\n public readonly jitter = new Vector2();\n\n /** @internal */\n public readonly _materialPlugins: TAAJitterMaterialPlugin[] = [];\n\n /**\n * @param scene All materials in this scene will have a jitter offset applied to them.\n */\n constructor(scene: Scene) {\n for (const material of scene.materials) {\n this._getPlugin(material);\n }\n RegisterMaterialPlugin(TAAJitterMaterialPlugin.Name, (material) => this._getPlugin(material));\n }\n\n /**\n * Disposes of the material manager.\n */\n public dispose(): void {\n UnregisterMaterialPlugin(TAAJitterMaterialPlugin.Name);\n const plugins = this._materialPlugins.splice(0, this._materialPlugins.length);\n for (const plugin of plugins) {\n plugin.manager = null;\n }\n }\n\n private _getPlugin(material: Material): TAAJitterMaterialPlugin {\n let plugin = material.pluginManager?.getPlugin<TAAJitterMaterialPlugin>(TAAJitterMaterialPlugin.Name);\n if (!plugin) {\n plugin = new TAAJitterMaterialPlugin(material);\n }\n plugin.manager = this;\n return plugin;\n }\n}\n"]}
|
|
@@ -37,6 +37,17 @@ export declare class TAARenderingPipeline extends PostProcessRenderPipeline {
|
|
|
37
37
|
*/
|
|
38
38
|
get disableOnCameraMove(): boolean;
|
|
39
39
|
set disableOnCameraMove(value: boolean);
|
|
40
|
+
/**
|
|
41
|
+
* Enables reprojecting the history texture with a per-pixel velocity.
|
|
42
|
+
*/
|
|
43
|
+
get reprojectHistory(): boolean;
|
|
44
|
+
set reprojectHistory(reproject: boolean);
|
|
45
|
+
/**
|
|
46
|
+
* Clamps the history pixel to the min and max of the 3x3 pixels surrounding the target pixel.
|
|
47
|
+
* This can help further reduce ghosting and artifacts.
|
|
48
|
+
*/
|
|
49
|
+
get clampHistory(): boolean;
|
|
50
|
+
set clampHistory(history: boolean);
|
|
40
51
|
private _isEnabled;
|
|
41
52
|
/**
|
|
42
53
|
* Gets or sets a boolean indicating if the render pipeline is enabled (default: true).
|
|
@@ -53,6 +64,7 @@ export declare class TAARenderingPipeline extends PostProcessRenderPipeline {
|
|
|
53
64
|
private _textureType;
|
|
54
65
|
private _taaPostProcess;
|
|
55
66
|
private _taaThinPostProcess;
|
|
67
|
+
private _taaMaterialManager;
|
|
56
68
|
private _passPostProcess;
|
|
57
69
|
private _ping;
|
|
58
70
|
private _pong;
|
|
@@ -9,7 +9,16 @@ import { RegisterClass } from "../../../Misc/typeStore.js";
|
|
|
9
9
|
|
|
10
10
|
import { PassPostProcess } from "../../passPostProcess.js";
|
|
11
11
|
import { ThinTAAPostProcess } from "../../thinTAAPostProcess.js";
|
|
12
|
+
import { TAAMaterialManager } from "./taaMaterialManager.js";
|
|
13
|
+
import { Logger } from "../../../Misc/logger.js";
|
|
12
14
|
import "../postProcessRenderPipelineManagerSceneComponent.js";
|
|
15
|
+
class TAAEffectConfiguration {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.name = "taa";
|
|
18
|
+
this.enabled = true;
|
|
19
|
+
this.texturesRequired = [11];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
13
22
|
/**
|
|
14
23
|
* Simple implementation of Temporal Anti-Aliasing (TAA).
|
|
15
24
|
* This can be used to improve image quality for still pictures (screenshots for e.g.).
|
|
@@ -58,6 +67,33 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
|
|
|
58
67
|
set disableOnCameraMove(value) {
|
|
59
68
|
this._taaThinPostProcess.disableOnCameraMove = value;
|
|
60
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Enables reprojecting the history texture with a per-pixel velocity.
|
|
72
|
+
*/
|
|
73
|
+
get reprojectHistory() {
|
|
74
|
+
return this._taaThinPostProcess.reprojectHistory;
|
|
75
|
+
}
|
|
76
|
+
set reprojectHistory(reproject) {
|
|
77
|
+
if (this.reprojectHistory === reproject) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
else if (reproject && !this._scene.enablePrePassRenderer()) {
|
|
81
|
+
Logger.Warn("TAA reprojection requires PrePass which is not supported");
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
this._taaThinPostProcess.reprojectHistory = reproject;
|
|
85
|
+
this._buildPipeline();
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Clamps the history pixel to the min and max of the 3x3 pixels surrounding the target pixel.
|
|
89
|
+
* This can help further reduce ghosting and artifacts.
|
|
90
|
+
*/
|
|
91
|
+
get clampHistory() {
|
|
92
|
+
return this._taaThinPostProcess.clampHistory;
|
|
93
|
+
}
|
|
94
|
+
set clampHistory(history) {
|
|
95
|
+
this._taaThinPostProcess.clampHistory = history;
|
|
96
|
+
}
|
|
61
97
|
/**
|
|
62
98
|
* Gets or sets a boolean indicating if the render pipeline is enabled (default: true).
|
|
63
99
|
*/
|
|
@@ -69,6 +105,7 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
|
|
|
69
105
|
return;
|
|
70
106
|
}
|
|
71
107
|
this._isEnabled = value;
|
|
108
|
+
this._taaMaterialManager.isEnabled = value;
|
|
72
109
|
if (!value) {
|
|
73
110
|
if (this._cameras !== null) {
|
|
74
111
|
this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);
|
|
@@ -129,6 +166,7 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
|
|
|
129
166
|
this._scene = scene;
|
|
130
167
|
this._textureType = textureType;
|
|
131
168
|
this._taaThinPostProcess = new ThinTAAPostProcess("TAA", this._scene.getEngine());
|
|
169
|
+
this._taaMaterialManager = new TAAMaterialManager(scene);
|
|
132
170
|
if (this.isSupported) {
|
|
133
171
|
this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());
|
|
134
172
|
scene.postProcessRenderPipelineManager.addPipeline(this);
|
|
@@ -166,6 +204,7 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
|
|
|
166
204
|
this._disposePostProcesses();
|
|
167
205
|
this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);
|
|
168
206
|
this._scene.postProcessRenderPipelineManager.removePipeline(this._name);
|
|
207
|
+
this._taaMaterialManager.dispose();
|
|
169
208
|
this._ping.dispose();
|
|
170
209
|
this._pong.dispose();
|
|
171
210
|
super.dispose();
|
|
@@ -174,8 +213,8 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
|
|
|
174
213
|
const engine = this._scene.getEngine();
|
|
175
214
|
this._ping?.dispose();
|
|
176
215
|
this._pong?.dispose();
|
|
177
|
-
this._ping = engine.createRenderTargetTexture({ width, height }, { generateMipMaps: false, generateDepthBuffer: false, type: 2, samplingMode:
|
|
178
|
-
this._pong = engine.createRenderTargetTexture({ width, height }, { generateMipMaps: false, generateDepthBuffer: false, type: 2, samplingMode:
|
|
216
|
+
this._ping = engine.createRenderTargetTexture({ width, height }, { generateMipMaps: false, generateDepthBuffer: false, type: 2, samplingMode: 2 });
|
|
217
|
+
this._pong = engine.createRenderTargetTexture({ width, height }, { generateMipMaps: false, generateDepthBuffer: false, type: 2, samplingMode: 2 });
|
|
179
218
|
this._taaThinPostProcess.textureWidth = width;
|
|
180
219
|
this._taaThinPostProcess.textureHeight = height;
|
|
181
220
|
}
|
|
@@ -227,6 +266,9 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
|
|
|
227
266
|
textureType: this._textureType,
|
|
228
267
|
effectWrapper: this._taaThinPostProcess,
|
|
229
268
|
});
|
|
269
|
+
if (this.reprojectHistory) {
|
|
270
|
+
this._taaPostProcess._prePassEffectConfiguration = new TAAEffectConfiguration();
|
|
271
|
+
}
|
|
230
272
|
this._taaPostProcess.samples = this._msaaSamples;
|
|
231
273
|
this._taaPostProcess.onActivateObservable.add(() => {
|
|
232
274
|
this._taaThinPostProcess.camera = this._scene.activeCamera;
|
|
@@ -234,7 +276,7 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
|
|
|
234
276
|
const engine = this._scene.getEngine();
|
|
235
277
|
this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());
|
|
236
278
|
}
|
|
237
|
-
this._taaThinPostProcess.
|
|
279
|
+
this._taaThinPostProcess.nextJitterOffset(this._taaMaterialManager.jitter);
|
|
238
280
|
if (this._passPostProcess) {
|
|
239
281
|
this._passPostProcess.inputTexture = this._pingpong ? this._ping : this._pong;
|
|
240
282
|
}
|
|
@@ -242,6 +284,12 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
|
|
|
242
284
|
});
|
|
243
285
|
this._taaPostProcess.onApplyObservable.add((effect) => {
|
|
244
286
|
effect._bindTexture("historySampler", this._pingpong ? this._ping.texture : this._pong.texture);
|
|
287
|
+
const prePassRenderer = this._scene.prePassRenderer;
|
|
288
|
+
if (this.reprojectHistory && prePassRenderer) {
|
|
289
|
+
const renderTarget = prePassRenderer.getRenderTarget();
|
|
290
|
+
const velocityIndex = prePassRenderer.getIndex(11);
|
|
291
|
+
effect.setTexture("velocitySampler", renderTarget.textures[velocityIndex]);
|
|
292
|
+
}
|
|
245
293
|
});
|
|
246
294
|
}
|
|
247
295
|
_createPassPostProcess() {
|
|
@@ -282,6 +330,12 @@ __decorate([
|
|
|
282
330
|
__decorate([
|
|
283
331
|
serialize()
|
|
284
332
|
], TAARenderingPipeline.prototype, "disableOnCameraMove", null);
|
|
333
|
+
__decorate([
|
|
334
|
+
serialize()
|
|
335
|
+
], TAARenderingPipeline.prototype, "reprojectHistory", null);
|
|
336
|
+
__decorate([
|
|
337
|
+
serialize()
|
|
338
|
+
], TAARenderingPipeline.prototype, "clampHistory", null);
|
|
285
339
|
__decorate([
|
|
286
340
|
serialize("isEnabled")
|
|
287
341
|
], TAARenderingPipeline.prototype, "_isEnabled", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"taaRenderingPipeline.js","sourceRoot":"","sources":["../../../../../../dev/core/src/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { serialize } from \"../../../Misc/decorators\";\r\nimport { SerializationHelper } from \"../../../Misc/decorators.serialization\";\r\nimport type { Camera } from \"../../../Cameras/camera\";\r\nimport type { Effect } from \"../../../Materials/effect\";\r\nimport { PostProcess } from \"../../postProcess\";\r\nimport { PostProcessRenderPipeline } from \"../postProcessRenderPipeline\";\r\nimport { PostProcessRenderEffect } from \"../postProcessRenderEffect\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport { PassPostProcess } from \"core/PostProcesses/passPostProcess\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\nimport { ThinTAAPostProcess } from \"core/PostProcesses/thinTAAPostProcess\";\r\n\r\nimport \"../postProcessRenderPipelineManagerSceneComponent\";\r\n\r\n/**\r\n * Simple implementation of Temporal Anti-Aliasing (TAA).\r\n * This can be used to improve image quality for still pictures (screenshots for e.g.).\r\n */\r\nexport class TAARenderingPipeline extends PostProcessRenderPipeline {\r\n /**\r\n * The TAA PostProcess effect id in the pipeline\r\n */\r\n public TAARenderEffect: string = \"TAARenderEffect\";\r\n /**\r\n * The pass PostProcess effect id in the pipeline\r\n */\r\n public TAAPassEffect: string = \"TAAPassEffect\";\r\n\r\n /**\r\n * Number of accumulated samples (default: 16)\r\n */\r\n @serialize(\"samples\")\r\n public set samples(samples: number) {\r\n this._taaThinPostProcess.samples = samples;\r\n }\r\n\r\n public get samples(): number {\r\n return this._taaThinPostProcess.samples;\r\n }\r\n\r\n @serialize(\"msaaSamples\")\r\n private _msaaSamples = 1;\r\n /**\r\n * MSAA samples (default: 1)\r\n */\r\n public set msaaSamples(samples: number) {\r\n if (this._msaaSamples === samples) {\r\n return;\r\n }\r\n\r\n this._msaaSamples = samples;\r\n if (this._taaPostProcess) {\r\n this._taaPostProcess.samples = samples;\r\n }\r\n }\r\n\r\n public get msaaSamples(): number {\r\n return this._msaaSamples;\r\n }\r\n\r\n /**\r\n * The factor used to blend the history frame with current frame (default: 0.05)\r\n */\r\n @serialize()\r\n public get factor() {\r\n return this._taaThinPostProcess.factor;\r\n }\r\n\r\n public set factor(value: number) {\r\n this._taaThinPostProcess.factor = value;\r\n }\r\n\r\n /**\r\n * Disable TAA on camera move (default: true).\r\n * You generally want to keep this enabled, otherwise you will get a ghost effect when the camera moves (but if it's what you want, go for it!)\r\n */\r\n @serialize()\r\n public get disableOnCameraMove() {\r\n return this._taaThinPostProcess.disableOnCameraMove;\r\n }\r\n\r\n public set disableOnCameraMove(value: boolean) {\r\n this._taaThinPostProcess.disableOnCameraMove = value;\r\n }\r\n\r\n @serialize(\"isEnabled\")\r\n private _isEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if the render pipeline is enabled (default: true).\r\n */\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n\r\n if (!value) {\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n this._cameras = this._camerasToBeAttached.slice();\r\n }\r\n } else if (value) {\r\n if (!this._isDirty) {\r\n if (this._cameras !== null) {\r\n this._taaThinPostProcess._reset();\r\n this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras);\r\n }\r\n } else {\r\n this._buildPipeline();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets active scene\r\n */\r\n public get scene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n private _scene: Scene;\r\n private _isDirty = false;\r\n private _camerasToBeAttached: Array<Camera> = [];\r\n private _textureType: number;\r\n private _taaPostProcess: Nullable<PostProcess>;\r\n private _taaThinPostProcess: ThinTAAPostProcess;\r\n private _passPostProcess: Nullable<PassPostProcess>;\r\n private _ping: RenderTargetWrapper;\r\n private _pong: RenderTargetWrapper;\r\n private _pingpong = 0;\r\n\r\n /**\r\n * Returns true if TAA is supported by the running hardware\r\n */\r\n public override get isSupported(): boolean {\r\n const caps = this._scene.getEngine().getCaps();\r\n\r\n return caps.texelFetch;\r\n }\r\n\r\n /**\r\n * Constructor of the TAA rendering pipeline\r\n * @param name The rendering pipeline name\r\n * @param scene The scene linked to this pipeline\r\n * @param cameras The array of cameras that the rendering pipeline will be attached to (default: scene.cameras)\r\n * @param textureType The type of texture where the scene will be rendered (default: Constants.TEXTURETYPE_UNSIGNED_BYTE)\r\n */\r\n constructor(name: string, scene: Scene, cameras?: Camera[], textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE) {\r\n const engine = scene.getEngine();\r\n\r\n super(engine, name);\r\n\r\n this._cameras = cameras || scene.cameras;\r\n this._cameras = this._cameras.slice();\r\n this._camerasToBeAttached = this._cameras.slice();\r\n\r\n this._scene = scene;\r\n this._textureType = textureType;\r\n this._taaThinPostProcess = new ThinTAAPostProcess(\"TAA\", this._scene.getEngine());\r\n\r\n if (this.isSupported) {\r\n this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());\r\n\r\n scene.postProcessRenderPipelineManager.addPipeline(this);\r\n\r\n this._buildPipeline();\r\n }\r\n }\r\n\r\n /**\r\n * Get the class name\r\n * @returns \"TAARenderingPipeline\"\r\n */\r\n public override getClassName(): string {\r\n return \"TAARenderingPipeline\";\r\n }\r\n\r\n /**\r\n * Adds a camera to the pipeline\r\n * @param camera the camera to be added\r\n */\r\n public addCamera(camera: Camera): void {\r\n this._camerasToBeAttached.push(camera);\r\n this._buildPipeline();\r\n }\r\n\r\n /**\r\n * Removes a camera from the pipeline\r\n * @param camera the camera to remove\r\n */\r\n public removeCamera(camera: Camera): void {\r\n const index = this._camerasToBeAttached.indexOf(camera);\r\n this._camerasToBeAttached.splice(index, 1);\r\n this._buildPipeline();\r\n }\r\n\r\n /**\r\n * Removes the internal pipeline assets and detaches the pipeline from the scene cameras\r\n */\r\n public override dispose(): void {\r\n this._disposePostProcesses();\r\n\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n\r\n this._scene.postProcessRenderPipelineManager.removePipeline(this._name);\r\n\r\n this._ping.dispose();\r\n this._pong.dispose();\r\n\r\n super.dispose();\r\n }\r\n\r\n private _createPingPongTextures(width: number, height: number) {\r\n const engine = this._scene.getEngine();\r\n\r\n this._ping?.dispose();\r\n this._pong?.dispose();\r\n\r\n this._ping = engine.createRenderTargetTexture(\r\n { width, height },\r\n { generateMipMaps: false, generateDepthBuffer: false, type: Constants.TEXTURETYPE_HALF_FLOAT, samplingMode: Constants.TEXTURE_NEAREST_NEAREST }\r\n );\r\n\r\n this._pong = engine.createRenderTargetTexture(\r\n { width, height },\r\n { generateMipMaps: false, generateDepthBuffer: false, type: Constants.TEXTURETYPE_HALF_FLOAT, samplingMode: Constants.TEXTURE_NEAREST_NEAREST }\r\n );\r\n\r\n this._taaThinPostProcess.textureWidth = width;\r\n this._taaThinPostProcess.textureHeight = height;\r\n }\r\n\r\n private _buildPipeline() {\r\n if (!this.isSupported) {\r\n return;\r\n }\r\n\r\n if (!this._isEnabled) {\r\n this._isDirty = true;\r\n return;\r\n }\r\n\r\n this._isDirty = false;\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n this._disposePostProcesses();\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n // get back cameras to be used to reattach pipeline\r\n this._cameras = this._camerasToBeAttached.slice();\r\n }\r\n this._reset();\r\n\r\n this._createTAAPostProcess();\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n engine,\r\n this.TAARenderEffect,\r\n () => {\r\n return this._taaPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n\r\n this._createPassPostProcess();\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n engine,\r\n this.TAAPassEffect,\r\n () => {\r\n return this._passPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras);\r\n }\r\n }\r\n\r\n private _disposePostProcesses(): void {\r\n for (let i = 0; i < this._cameras.length; i++) {\r\n const camera = this._cameras[i];\r\n\r\n this._taaPostProcess?.dispose(camera);\r\n this._passPostProcess?.dispose(camera);\r\n\r\n camera.getProjectionMatrix(true); // recompute the projection matrix\r\n }\r\n\r\n this._taaPostProcess = null;\r\n this._passPostProcess = null;\r\n }\r\n\r\n private _createTAAPostProcess(): void {\r\n this._taaPostProcess = new PostProcess(\"TAA\", \"taa\", {\r\n uniforms: [\"factor\"],\r\n samplers: [\"historySampler\"],\r\n size: 1.0,\r\n engine: this._scene.getEngine(),\r\n textureType: this._textureType,\r\n effectWrapper: this._taaThinPostProcess,\r\n });\r\n\r\n this._taaPostProcess.samples = this._msaaSamples;\r\n\r\n this._taaPostProcess.onActivateObservable.add(() => {\r\n this._taaThinPostProcess.camera = this._scene.activeCamera;\r\n\r\n if (this._taaPostProcess?.width !== this._ping.width || this._taaPostProcess?.height !== this._ping.height) {\r\n const engine = this._scene.getEngine();\r\n this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());\r\n }\r\n\r\n this._taaThinPostProcess.updateProjectionMatrix();\r\n\r\n if (this._passPostProcess) {\r\n this._passPostProcess.inputTexture = this._pingpong ? this._ping : this._pong;\r\n }\r\n this._pingpong = this._pingpong ^ 1;\r\n });\r\n\r\n this._taaPostProcess.onApplyObservable.add((effect: Effect) => {\r\n effect._bindTexture(\"historySampler\", this._pingpong ? this._ping.texture : this._pong.texture);\r\n });\r\n }\r\n\r\n private _createPassPostProcess() {\r\n const engine = this._scene.getEngine();\r\n\r\n this._passPostProcess = new PassPostProcess(\"TAAPass\", 1, null, Constants.TEXTURE_NEAREST_NEAREST, engine);\r\n this._passPostProcess.inputTexture = this._ping;\r\n this._passPostProcess.autoClear = false;\r\n }\r\n\r\n /**\r\n * Serializes the rendering pipeline (Used when exporting)\r\n * @returns the serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"TAARenderingPipeline\";\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parse the serialized pipeline\r\n * @param source Source pipeline.\r\n * @param scene The scene to load the pipeline to.\r\n * @param rootUrl The URL of the serialized pipeline.\r\n * @returns An instantiated pipeline from the serialized object.\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string): TAARenderingPipeline {\r\n return SerializationHelper.Parse(() => new TAARenderingPipeline(source._name, scene, source._ratio), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.TAARenderingPipeline\", TAARenderingPipeline);\r\n"]}
|
|
1
|
+
{"version":3,"file":"taaRenderingPipeline.js","sourceRoot":"","sources":["../../../../../../dev/core/src/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { serialize } from \"../../../Misc/decorators\";\r\nimport { SerializationHelper } from \"../../../Misc/decorators.serialization\";\r\nimport type { Camera } from \"../../../Cameras/camera\";\r\nimport type { Effect } from \"../../../Materials/effect\";\r\nimport { PostProcess } from \"../../postProcess\";\r\nimport { PostProcessRenderPipeline } from \"../postProcessRenderPipeline\";\r\nimport { PostProcessRenderEffect } from \"../postProcessRenderEffect\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport { PassPostProcess } from \"core/PostProcesses/passPostProcess\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\nimport { ThinTAAPostProcess } from \"core/PostProcesses/thinTAAPostProcess\";\r\nimport { TAAMaterialManager } from \"./taaMaterialManager\";\r\nimport type { PrePassEffectConfiguration } from \"core/Rendering/prePassEffectConfiguration\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\nimport \"../postProcessRenderPipelineManagerSceneComponent\";\r\n\r\nclass TAAEffectConfiguration implements PrePassEffectConfiguration {\r\n public name = \"taa\";\r\n public enabled = true;\r\n public readonly texturesRequired = [Constants.PREPASS_VELOCITY_LINEAR_TEXTURE_TYPE];\r\n}\r\n\r\n/**\r\n * Simple implementation of Temporal Anti-Aliasing (TAA).\r\n * This can be used to improve image quality for still pictures (screenshots for e.g.).\r\n */\r\nexport class TAARenderingPipeline extends PostProcessRenderPipeline {\r\n /**\r\n * The TAA PostProcess effect id in the pipeline\r\n */\r\n public TAARenderEffect: string = \"TAARenderEffect\";\r\n /**\r\n * The pass PostProcess effect id in the pipeline\r\n */\r\n public TAAPassEffect: string = \"TAAPassEffect\";\r\n\r\n /**\r\n * Number of accumulated samples (default: 16)\r\n */\r\n @serialize(\"samples\")\r\n public set samples(samples: number) {\r\n this._taaThinPostProcess.samples = samples;\r\n }\r\n\r\n public get samples(): number {\r\n return this._taaThinPostProcess.samples;\r\n }\r\n\r\n @serialize(\"msaaSamples\")\r\n private _msaaSamples = 1;\r\n /**\r\n * MSAA samples (default: 1)\r\n */\r\n public set msaaSamples(samples: number) {\r\n if (this._msaaSamples === samples) {\r\n return;\r\n }\r\n\r\n this._msaaSamples = samples;\r\n if (this._taaPostProcess) {\r\n this._taaPostProcess.samples = samples;\r\n }\r\n }\r\n\r\n public get msaaSamples(): number {\r\n return this._msaaSamples;\r\n }\r\n\r\n /**\r\n * The factor used to blend the history frame with current frame (default: 0.05)\r\n */\r\n @serialize()\r\n public get factor() {\r\n return this._taaThinPostProcess.factor;\r\n }\r\n\r\n public set factor(value: number) {\r\n this._taaThinPostProcess.factor = value;\r\n }\r\n\r\n /**\r\n * Disable TAA on camera move (default: true).\r\n * You generally want to keep this enabled, otherwise you will get a ghost effect when the camera moves (but if it's what you want, go for it!)\r\n */\r\n @serialize()\r\n public get disableOnCameraMove() {\r\n return this._taaThinPostProcess.disableOnCameraMove;\r\n }\r\n\r\n public set disableOnCameraMove(value: boolean) {\r\n this._taaThinPostProcess.disableOnCameraMove = value;\r\n }\r\n\r\n /**\r\n * Enables reprojecting the history texture with a per-pixel velocity.\r\n */\r\n @serialize()\r\n public get reprojectHistory(): boolean {\r\n return this._taaThinPostProcess.reprojectHistory;\r\n }\r\n\r\n public set reprojectHistory(reproject: boolean) {\r\n if (this.reprojectHistory === reproject) {\r\n return;\r\n } else if (reproject && !this._scene.enablePrePassRenderer()) {\r\n Logger.Warn(\"TAA reprojection requires PrePass which is not supported\");\r\n return;\r\n }\r\n this._taaThinPostProcess.reprojectHistory = reproject;\r\n this._buildPipeline();\r\n }\r\n\r\n /**\r\n * Clamps the history pixel to the min and max of the 3x3 pixels surrounding the target pixel.\r\n * This can help further reduce ghosting and artifacts.\r\n */\r\n @serialize()\r\n public get clampHistory(): boolean {\r\n return this._taaThinPostProcess.clampHistory;\r\n }\r\n\r\n public set clampHistory(history: boolean) {\r\n this._taaThinPostProcess.clampHistory = history;\r\n }\r\n\r\n @serialize(\"isEnabled\")\r\n private _isEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if the render pipeline is enabled (default: true).\r\n */\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n this._taaMaterialManager.isEnabled = value;\r\n\r\n if (!value) {\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n this._cameras = this._camerasToBeAttached.slice();\r\n }\r\n } else if (value) {\r\n if (!this._isDirty) {\r\n if (this._cameras !== null) {\r\n this._taaThinPostProcess._reset();\r\n this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras);\r\n }\r\n } else {\r\n this._buildPipeline();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets active scene\r\n */\r\n public get scene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n private _scene: Scene;\r\n private _isDirty = false;\r\n private _camerasToBeAttached: Array<Camera> = [];\r\n private _textureType: number;\r\n private _taaPostProcess: Nullable<PostProcess>;\r\n private _taaThinPostProcess: ThinTAAPostProcess;\r\n private _taaMaterialManager: TAAMaterialManager;\r\n private _passPostProcess: Nullable<PassPostProcess>;\r\n private _ping: RenderTargetWrapper;\r\n private _pong: RenderTargetWrapper;\r\n private _pingpong = 0;\r\n\r\n /**\r\n * Returns true if TAA is supported by the running hardware\r\n */\r\n public override get isSupported(): boolean {\r\n const caps = this._scene.getEngine().getCaps();\r\n\r\n return caps.texelFetch;\r\n }\r\n\r\n /**\r\n * Constructor of the TAA rendering pipeline\r\n * @param name The rendering pipeline name\r\n * @param scene The scene linked to this pipeline\r\n * @param cameras The array of cameras that the rendering pipeline will be attached to (default: scene.cameras)\r\n * @param textureType The type of texture where the scene will be rendered (default: Constants.TEXTURETYPE_UNSIGNED_BYTE)\r\n */\r\n constructor(name: string, scene: Scene, cameras?: Camera[], textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE) {\r\n const engine = scene.getEngine();\r\n\r\n super(engine, name);\r\n\r\n this._cameras = cameras || scene.cameras;\r\n this._cameras = this._cameras.slice();\r\n this._camerasToBeAttached = this._cameras.slice();\r\n\r\n this._scene = scene;\r\n this._textureType = textureType;\r\n this._taaThinPostProcess = new ThinTAAPostProcess(\"TAA\", this._scene.getEngine());\r\n this._taaMaterialManager = new TAAMaterialManager(scene);\r\n\r\n if (this.isSupported) {\r\n this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());\r\n\r\n scene.postProcessRenderPipelineManager.addPipeline(this);\r\n\r\n this._buildPipeline();\r\n }\r\n }\r\n\r\n /**\r\n * Get the class name\r\n * @returns \"TAARenderingPipeline\"\r\n */\r\n public override getClassName(): string {\r\n return \"TAARenderingPipeline\";\r\n }\r\n\r\n /**\r\n * Adds a camera to the pipeline\r\n * @param camera the camera to be added\r\n */\r\n public addCamera(camera: Camera): void {\r\n this._camerasToBeAttached.push(camera);\r\n this._buildPipeline();\r\n }\r\n\r\n /**\r\n * Removes a camera from the pipeline\r\n * @param camera the camera to remove\r\n */\r\n public removeCamera(camera: Camera): void {\r\n const index = this._camerasToBeAttached.indexOf(camera);\r\n this._camerasToBeAttached.splice(index, 1);\r\n this._buildPipeline();\r\n }\r\n\r\n /**\r\n * Removes the internal pipeline assets and detaches the pipeline from the scene cameras\r\n */\r\n public override dispose(): void {\r\n this._disposePostProcesses();\r\n\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n\r\n this._scene.postProcessRenderPipelineManager.removePipeline(this._name);\r\n\r\n this._taaMaterialManager.dispose();\r\n this._ping.dispose();\r\n this._pong.dispose();\r\n\r\n super.dispose();\r\n }\r\n\r\n private _createPingPongTextures(width: number, height: number) {\r\n const engine = this._scene.getEngine();\r\n\r\n this._ping?.dispose();\r\n this._pong?.dispose();\r\n\r\n this._ping = engine.createRenderTargetTexture(\r\n { width, height },\r\n { generateMipMaps: false, generateDepthBuffer: false, type: Constants.TEXTURETYPE_HALF_FLOAT, samplingMode: Constants.TEXTURE_LINEAR_LINEAR }\r\n );\r\n\r\n this._pong = engine.createRenderTargetTexture(\r\n { width, height },\r\n { generateMipMaps: false, generateDepthBuffer: false, type: Constants.TEXTURETYPE_HALF_FLOAT, samplingMode: Constants.TEXTURE_LINEAR_LINEAR }\r\n );\r\n\r\n this._taaThinPostProcess.textureWidth = width;\r\n this._taaThinPostProcess.textureHeight = height;\r\n }\r\n\r\n private _buildPipeline() {\r\n if (!this.isSupported) {\r\n return;\r\n }\r\n\r\n if (!this._isEnabled) {\r\n this._isDirty = true;\r\n return;\r\n }\r\n\r\n this._isDirty = false;\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n this._disposePostProcesses();\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n // get back cameras to be used to reattach pipeline\r\n this._cameras = this._camerasToBeAttached.slice();\r\n }\r\n this._reset();\r\n\r\n this._createTAAPostProcess();\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n engine,\r\n this.TAARenderEffect,\r\n () => {\r\n return this._taaPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n\r\n this._createPassPostProcess();\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n engine,\r\n this.TAAPassEffect,\r\n () => {\r\n return this._passPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras);\r\n }\r\n }\r\n\r\n private _disposePostProcesses(): void {\r\n for (let i = 0; i < this._cameras.length; i++) {\r\n const camera = this._cameras[i];\r\n\r\n this._taaPostProcess?.dispose(camera);\r\n this._passPostProcess?.dispose(camera);\r\n\r\n camera.getProjectionMatrix(true); // recompute the projection matrix\r\n }\r\n\r\n this._taaPostProcess = null;\r\n this._passPostProcess = null;\r\n }\r\n\r\n private _createTAAPostProcess(): void {\r\n this._taaPostProcess = new PostProcess(\"TAA\", \"taa\", {\r\n uniforms: [\"factor\"],\r\n samplers: [\"historySampler\"],\r\n size: 1.0,\r\n engine: this._scene.getEngine(),\r\n textureType: this._textureType,\r\n effectWrapper: this._taaThinPostProcess,\r\n });\r\n\r\n if (this.reprojectHistory) {\r\n this._taaPostProcess._prePassEffectConfiguration = new TAAEffectConfiguration();\r\n }\r\n\r\n this._taaPostProcess.samples = this._msaaSamples;\r\n\r\n this._taaPostProcess.onActivateObservable.add(() => {\r\n this._taaThinPostProcess.camera = this._scene.activeCamera;\r\n\r\n if (this._taaPostProcess?.width !== this._ping.width || this._taaPostProcess?.height !== this._ping.height) {\r\n const engine = this._scene.getEngine();\r\n this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());\r\n }\r\n\r\n this._taaThinPostProcess.nextJitterOffset(this._taaMaterialManager.jitter);\r\n\r\n if (this._passPostProcess) {\r\n this._passPostProcess.inputTexture = this._pingpong ? this._ping : this._pong;\r\n }\r\n this._pingpong = this._pingpong ^ 1;\r\n });\r\n\r\n this._taaPostProcess.onApplyObservable.add((effect: Effect) => {\r\n effect._bindTexture(\"historySampler\", this._pingpong ? this._ping.texture : this._pong.texture);\r\n\r\n const prePassRenderer = this._scene.prePassRenderer;\r\n if (this.reprojectHistory && prePassRenderer) {\r\n const renderTarget = prePassRenderer.getRenderTarget();\r\n const velocityIndex = prePassRenderer.getIndex(Constants.PREPASS_VELOCITY_LINEAR_TEXTURE_TYPE);\r\n effect.setTexture(\"velocitySampler\", renderTarget.textures[velocityIndex]);\r\n }\r\n });\r\n }\r\n\r\n private _createPassPostProcess() {\r\n const engine = this._scene.getEngine();\r\n\r\n this._passPostProcess = new PassPostProcess(\"TAAPass\", 1, null, Constants.TEXTURE_NEAREST_NEAREST, engine);\r\n this._passPostProcess.inputTexture = this._ping;\r\n this._passPostProcess.autoClear = false;\r\n }\r\n\r\n /**\r\n * Serializes the rendering pipeline (Used when exporting)\r\n * @returns the serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"TAARenderingPipeline\";\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parse the serialized pipeline\r\n * @param source Source pipeline.\r\n * @param scene The scene to load the pipeline to.\r\n * @param rootUrl The URL of the serialized pipeline.\r\n * @returns An instantiated pipeline from the serialized object.\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string): TAARenderingPipeline {\r\n return SerializationHelper.Parse(() => new TAARenderingPipeline(source._name, scene, source._ratio), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.TAARenderingPipeline\", TAARenderingPipeline);\r\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from "../index.js";
|
|
2
2
|
import { Camera } from "../Cameras/camera.js";
|
|
3
|
+
import { Vector2 } from "../Maths/math.vector.js";
|
|
3
4
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
4
5
|
/**
|
|
5
6
|
* Simple implementation of Temporal Anti-Aliasing (TAA).
|
|
@@ -56,6 +57,20 @@ export declare class ThinTAAPostProcess extends EffectWrapper {
|
|
|
56
57
|
* You generally want to keep this enabled, otherwise you will get a ghost effect when the camera moves (but if it's what you want, go for it!)
|
|
57
58
|
*/
|
|
58
59
|
disableOnCameraMove: boolean;
|
|
60
|
+
private _reprojectHistory;
|
|
61
|
+
/**
|
|
62
|
+
* Enables reprojecting the history texture with a per-pixel velocity.
|
|
63
|
+
* If set the "velocitySampler" has to be provided.
|
|
64
|
+
*/
|
|
65
|
+
get reprojectHistory(): boolean;
|
|
66
|
+
set reprojectHistory(reproject: boolean);
|
|
67
|
+
private _clampHistory;
|
|
68
|
+
/**
|
|
69
|
+
* Clamps the history pixel to the min and max of the 3x3 pixels surrounding the target pixel.
|
|
70
|
+
* This can help further reduce ghosting and artifacts.
|
|
71
|
+
*/
|
|
72
|
+
get clampHistory(): boolean;
|
|
73
|
+
set clampHistory(clamp: boolean);
|
|
59
74
|
private _hs;
|
|
60
75
|
private _firstUpdate;
|
|
61
76
|
/**
|
|
@@ -67,6 +82,8 @@ export declare class ThinTAAPostProcess extends EffectWrapper {
|
|
|
67
82
|
constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
|
|
68
83
|
/** @internal */
|
|
69
84
|
_reset(): void;
|
|
85
|
+
nextJitterOffset(output?: Vector2): Vector2;
|
|
70
86
|
updateProjectionMatrix(): void;
|
|
71
87
|
bind(noDefaultBindings?: boolean): void;
|
|
88
|
+
private _updateEffect;
|
|
72
89
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Camera } from "../Cameras/camera.js";
|
|
2
2
|
import { Halton2DSequence } from "../Maths/halton2DSequence.js";
|
|
3
|
+
import { Vector2 } from "../Maths/math.vector.js";
|
|
3
4
|
import { Engine } from "../Engines/engine.js";
|
|
4
5
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
5
6
|
/**
|
|
@@ -68,6 +69,34 @@ export class ThinTAAPostProcess extends EffectWrapper {
|
|
|
68
69
|
this._textureHeight = height;
|
|
69
70
|
this._reset();
|
|
70
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Enables reprojecting the history texture with a per-pixel velocity.
|
|
74
|
+
* If set the "velocitySampler" has to be provided.
|
|
75
|
+
*/
|
|
76
|
+
get reprojectHistory() {
|
|
77
|
+
return this._reprojectHistory;
|
|
78
|
+
}
|
|
79
|
+
set reprojectHistory(reproject) {
|
|
80
|
+
if (this._reprojectHistory === reproject) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
this._reprojectHistory = reproject;
|
|
84
|
+
this._updateEffect();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Clamps the history pixel to the min and max of the 3x3 pixels surrounding the target pixel.
|
|
88
|
+
* This can help further reduce ghosting and artifacts.
|
|
89
|
+
*/
|
|
90
|
+
get clampHistory() {
|
|
91
|
+
return this._clampHistory;
|
|
92
|
+
}
|
|
93
|
+
set clampHistory(clamp) {
|
|
94
|
+
if (this._clampHistory === clamp) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
this._clampHistory = clamp;
|
|
98
|
+
this._updateEffect();
|
|
99
|
+
}
|
|
71
100
|
/**
|
|
72
101
|
* Constructs a new TAA post process
|
|
73
102
|
* @param name Name of the effect
|
|
@@ -98,6 +127,8 @@ export class ThinTAAPostProcess extends EffectWrapper {
|
|
|
98
127
|
* You generally want to keep this enabled, otherwise you will get a ghost effect when the camera moves (but if it's what you want, go for it!)
|
|
99
128
|
*/
|
|
100
129
|
this.disableOnCameraMove = true;
|
|
130
|
+
this._reprojectHistory = false;
|
|
131
|
+
this._clampHistory = false;
|
|
101
132
|
this._firstUpdate = true;
|
|
102
133
|
this._hs = new Halton2DSequence(this.samples);
|
|
103
134
|
}
|
|
@@ -107,6 +138,13 @@ export class ThinTAAPostProcess extends EffectWrapper {
|
|
|
107
138
|
this._hs.next();
|
|
108
139
|
this._firstUpdate = true;
|
|
109
140
|
}
|
|
141
|
+
nextJitterOffset(output = new Vector2()) {
|
|
142
|
+
if (!this.camera || !this.camera.hasMoved) {
|
|
143
|
+
this._hs.next();
|
|
144
|
+
}
|
|
145
|
+
output.set(this._hs.x, this._hs.y);
|
|
146
|
+
return output;
|
|
147
|
+
}
|
|
110
148
|
updateProjectionMatrix() {
|
|
111
149
|
if (this.disabled) {
|
|
112
150
|
return;
|
|
@@ -133,6 +171,19 @@ export class ThinTAAPostProcess extends EffectWrapper {
|
|
|
133
171
|
effect.setFloat("factor", (this.camera?.hasMoved && this.disableOnCameraMove) || this._firstUpdate ? 1 : this.factor);
|
|
134
172
|
this._firstUpdate = false;
|
|
135
173
|
}
|
|
174
|
+
_updateEffect() {
|
|
175
|
+
const defines = [];
|
|
176
|
+
// There seems to be an issue where `updateEffect` sometimes doesn't include the initial samplers
|
|
177
|
+
const samplers = ["textureSampler", "historySampler"];
|
|
178
|
+
if (this._reprojectHistory) {
|
|
179
|
+
defines.push("#define TAA_REPROJECT_HISTORY");
|
|
180
|
+
samplers.push("velocitySampler");
|
|
181
|
+
}
|
|
182
|
+
if (this._clampHistory) {
|
|
183
|
+
defines.push("#define TAA_CLAMP_HISTORY");
|
|
184
|
+
}
|
|
185
|
+
this.updateEffect(defines.join("\n"), null, samplers);
|
|
186
|
+
}
|
|
136
187
|
}
|
|
137
188
|
/**
|
|
138
189
|
* The fragment shader url
|