@itwin/core-frontend
Version:
iTwin.js frontend components
115 lines (108 loc) • 5.2 kB
JavaScript
;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module WebGL
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.createBlurProgram = createBlurProgram;
const CachedGeometry_1 = require("../CachedGeometry");
const RenderFlags_1 = require("../RenderFlags");
const Texture_1 = require("../Texture");
const FeatureSymbology_1 = require("./FeatureSymbology");
const Fragment_1 = require("./Fragment");
const Viewport_1 = require("./Viewport");
const ViewportQuad_1 = require("./ViewportQuad");
// This shader applies a Gaussian blur in one dimension.
const computeBlur = `
float delta = u_blurSettings.x;
float sigma = u_blurSettings.y;
float texelStepSize = u_blurSettings.z;
vec2 tc = windowCoordsToTexCoords(gl_FragCoord.xy);
vec2 step = texelStepSize / u_viewport;
vec3 gaussian;
const float twoPi = 6.283185307179586;
gaussian.x = 1.0 / (sqrt(twoPi) * sigma);
gaussian.y = exp((-0.5 * delta * delta) / (sigma * sigma));
gaussian.z = gaussian.y * gaussian.y;
vec4 origColor = TEXTURE(u_textureToBlur, tc);
vec4 result = origColor * gaussian.x;
for (int i = 1; i < 8; i++) {
gaussian.xy *= gaussian.yz;
vec2 offset = float(i) * u_blurDir * step;
vec2 tcMinusOffset = tc - offset;
vec2 tcPlusOffset = tc + offset;
result += TEXTURE(u_textureToBlur, tcMinusOffset) * gaussian.x;
result += TEXTURE(u_textureToBlur, tcPlusOffset) * gaussian.x;
}
return result;
`;
// This optionally skips adding in the blur texture result if the current pixel is a linear/edge/silhouette.
const testRenderOrder = `
vec2 rotc = windowCoordsToTexCoords(gl_FragCoord.xy);
vec4 pdo = TEXTURE(u_pickDepthAndOrder, rotc);
float order = floor(pdo.x * 16.0 + 0.5);
if (order >= kRenderOrder_PlanarBit)
order = order - kRenderOrder_PlanarBit;
if (order >= kRenderOrder_Linear && order <= kRenderOrder_Silhouette)
return vec4(1.0);
`;
/** @internal */
function createBlurProgram(context, type) {
const builder = (0, ViewportQuad_1.createViewportQuadBuilder)(true);
const frag = builder.frag;
(0, Fragment_1.addWindowToTexCoords)(frag);
if (CachedGeometry_1.BlurType.TestOrder === type) {
(0, FeatureSymbology_1.addRenderOrderConstants)(frag);
frag.set(1 /* FragmentShaderComponent.ComputeBaseColor */, testRenderOrder + computeBlur);
}
else {
frag.set(1 /* FragmentShaderComponent.ComputeBaseColor */, computeBlur);
}
frag.set(18 /* FragmentShaderComponent.AssignFragData */, Fragment_1.assignFragColor);
(0, Viewport_1.addViewport)(frag);
frag.addUniform("u_textureToBlur", 8 /* VariableType.Sampler2D */, (prog) => {
prog.addGraphicUniform("u_textureToBlur", (uniform, params) => {
const geom = params.geometry;
Texture_1.Texture2DHandle.bindSampler(uniform, geom.textureToBlur, RenderFlags_1.TextureUnit.Zero);
});
});
frag.addUniform("u_blurDir", 3 /* VariableType.Vec2 */, (prog) => {
prog.addGraphicUniform("u_blurDir", (uniform, params) => {
const geom = params.geometry;
uniform.setUniform2fv(new Float32Array([geom.blurDir.x, geom.blurDir.y]));
});
});
frag.addUniform("u_blurSettings", 4 /* VariableType.Vec3 */, (prog) => {
prog.addProgramUniform("u_blurSettings", (uniform, params) => {
const hbaoSettings = new Float32Array([
// ###TODO: If we want to apply this blur shader to situations other than AO, we should move these settings away from the ambient occlusion params.
params.target.ambientOcclusionSettings.blurDelta,
params.target.ambientOcclusionSettings.blurSigma,
params.target.ambientOcclusionSettings.blurTexelStepSize
]);
uniform.setUniform3fv(hbaoSettings);
});
}, 3 /* VariablePrecision.High */);
if (CachedGeometry_1.BlurType.TestOrder === type) {
frag.addUniform("u_pickDepthAndOrder", 8 /* VariableType.Sampler2D */, (prog) => {
prog.addGraphicUniform("u_pickDepthAndOrder", (uniform, params) => {
const geom = params.geometry;
if (params.target.compositor.needHiddenEdges)
Texture_1.Texture2DHandle.bindSampler(uniform, geom.depthAndOrderHidden, RenderFlags_1.TextureUnit.One);
else
Texture_1.Texture2DHandle.bindSampler(uniform, geom.depthAndOrder, RenderFlags_1.TextureUnit.One);
});
});
builder.vert.headerComment = "//!V! BlurTestOrder";
builder.frag.headerComment = "//!F! BlurTestOrder";
}
else {
builder.vert.headerComment = "//!V! Blur";
builder.frag.headerComment = "//!F! Blur";
}
return builder.buildProgram(context);
}
//# sourceMappingURL=Blur.js.map