@babylonjs/core
Version:
Getting started? Play directly with the Babylon.js API using our [playground](https://playground.babylonjs.com/). It also contains a lot of samples to learn how to use it.
156 lines • 5 kB
JavaScript
import { MaterialDefines } from "../../../Materials/materialDefines.js";
import { MaterialPluginBase } from "../../../Materials/materialPluginBase.js";
import { RegisterMaterialPlugin, UnregisterMaterialPlugin } from "../../../Materials/materialPluginManager.js";
import { Vector2 } from "../../../Maths/math.vector.js";
class TAAJitterMaterialDefines extends MaterialDefines {
constructor() {
super(...arguments);
this.TAA_JITTER = false;
}
}
class TAAJitterMaterialPlugin extends MaterialPluginBase {
get manager() {
return this._manager;
}
set manager(manager) {
if (this._manager === manager) {
return;
}
this.dispose();
this._manager = manager;
manager?._materialPlugins.push(this);
this._updateMaterial();
}
get isEnabled() {
return this._manager?.isEnabled ?? false;
}
constructor(material) {
super(material, TAAJitterMaterialPlugin.Name, 300, new TAAJitterMaterialDefines());
this.registerForExtraEvents = true;
}
/** @internal */
_updateMaterial() {
this._enable(this.isEnabled);
this.markAllDefinesAsDirty();
}
isCompatible() {
return true;
}
getClassName() {
return "TAAJitterMaterialPlugin";
}
prepareDefines(defines) {
defines.TAA_JITTER = this.isEnabled;
}
getUniforms(shaderLanguage = 0 /* ShaderLanguage.GLSL */) {
const ubo = [{ name: "taa_jitter", size: 2, type: "vec2" }];
if (shaderLanguage === 0 /* ShaderLanguage.GLSL */) {
return {
ubo,
vertex: `
#ifdef TAA_JITTER
uniform vec2 taa_jitter;
#endif
`,
};
}
else {
return { ubo };
}
}
hardBindForSubMesh(uniformBuffer) {
if (this.isEnabled) {
const jitter = this._manager.jitter;
uniformBuffer.updateFloat2("taa_jitter", jitter.x, jitter.y);
}
}
getCustomCode(shaderType, shaderLanguage = 0 /* ShaderLanguage.GLSL */) {
// We jitter instead of modifying the camera so the velocity buffer stays unaffected
// More info: https://sugulee.wordpress.com/2021/06/21/temporal-anti-aliasingtaa-tutorial/
if (shaderType !== "vertex") {
return null;
}
else if (shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
return {
CUSTOM_VERTEX_MAIN_END: `
#ifdef TAA_JITTER
vertexOutputs.position += vec4f(uniforms.taa_jitter * vertexOutputs.position.w, 0, 1);
#endif
`,
};
}
else {
return {
CUSTOM_VERTEX_MAIN_END: `
#ifdef TAA_JITTER
gl_Position.xy += taa_jitter * gl_Position.w;
#endif
`,
};
}
}
dispose() {
if (this._manager) {
const index = this._manager._materialPlugins.indexOf(this);
if (index !== -1) {
this._manager._materialPlugins.splice(index, 1);
}
}
}
}
TAAJitterMaterialPlugin.Name = "TAAJitter";
/**
* Applies and manages the TAA jitter plugin on all materials.
*/
export class TAAMaterialManager {
/**
* Set to enable or disable the jitter offset on all materials.
*/
get isEnabled() {
return this._isEnabled;
}
set isEnabled(enabled) {
if (this._isEnabled === enabled) {
return;
}
this._isEnabled = enabled;
for (const plugin of this._materialPlugins) {
plugin._updateMaterial();
}
}
/**
* @param scene All materials in this scene will have a jitter offset applied to them.
*/
constructor(scene) {
this._isEnabled = true;
/**
* The current jitter offset to apply to all materials.
*/
this.jitter = new Vector2();
/** @internal */
this._materialPlugins = [];
for (const material of scene.materials) {
this._getPlugin(material);
}
RegisterMaterialPlugin(TAAJitterMaterialPlugin.Name, (material) => this._getPlugin(material));
}
/**
* Disposes of the material manager.
*/
dispose() {
UnregisterMaterialPlugin(TAAJitterMaterialPlugin.Name);
const plugins = this._materialPlugins.splice(0, this._materialPlugins.length);
for (const plugin of plugins) {
plugin.manager = null;
}
}
_getPlugin(material) {
let plugin = material.pluginManager?.getPlugin(TAAJitterMaterialPlugin.Name);
if (!plugin) {
plugin = new TAAJitterMaterialPlugin(material);
}
plugin.manager = this;
return plugin;
}
}
//# sourceMappingURL=taaMaterialManager.js.map