Skip to content

Commit 432c0e1

Browse files
fix: TiltShiftFilter coordinates are calculated incorrectly (#483)
* Bug: TiltShiftFilter coordinates are calculated incorrectly Fixes #470 * fixing po2 popping * port tiltshift fix to webgpu * fix webgpu filter * remove unused dimensions uniform --------- Co-authored-by: Matt Karl <[email protected]>
1 parent 7b721a8 commit 432c0e1

File tree

4 files changed

+13
-25
lines changed

4 files changed

+13
-25
lines changed

src/tilt-shift/TiltShiftAxisFilter.ts

+1-15
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Filter, GlProgram, GpuProgram, PointData, Texture, ViewSystem } from 'pixi.js';
1+
import { Filter, GlProgram, GpuProgram, PointData, ViewSystem } from 'pixi.js';
22
import { vertex, wgslVertex } from '../defaults';
33
import fragment from './tilt-shift.frag';
44
import source from './tilt-shift.wgsl';
@@ -46,7 +46,6 @@ export class TiltShiftAxisFilter extends Filter
4646
uStart: PointData
4747
uEnd: PointData;
4848
uDelta: Float32Array;
49-
uDimensions: Float32Array;
5049
};
5150

5251
private _tiltAxis: TiltShiftAxisFilterOptions['axis'];
@@ -95,7 +94,6 @@ export class TiltShiftAxisFilter extends Filter
9594
uStart: { value: options.start, type: 'vec2<f32>' },
9695
uEnd: { value: options.end, type: 'vec2<f32>' },
9796
uDelta: { value: new Float32Array([0, 0]), type: 'vec2<f32>' },
98-
uDimensions: { value: new Float32Array([width, height]), type: 'vec2<f32>' },
9997
},
10098
},
10199
});
@@ -104,18 +102,6 @@ export class TiltShiftAxisFilter extends Filter
104102
this._tiltAxis = options.axis;
105103
}
106104

107-
/**
108-
* Update the dimensions
109-
* @ignore
110-
*/
111-
public updateDimensions(input: Texture): void
112-
{
113-
const { uDimensions } = this.uniforms;
114-
115-
uDimensions[0] = input.frame.width;
116-
uDimensions[1] = input.frame.height;
117-
}
118-
119105
/**
120106
* Updates the filter delta values.
121107
* @ignore

src/tilt-shift/TiltShiftFilter.ts

-3
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,6 @@ export class TiltShiftFilter extends TiltShiftAxisFilter
6060
{
6161
const renderTarget = TexturePool.getSameSizeTexture(input);
6262

63-
this.updateDimensions(input);
64-
this._tiltShiftYFilter.updateDimensions(input);
65-
6663
filterManager.applyFilter(this, input, renderTarget, true);
6764
filterManager.applyFilter(this._tiltShiftYFilter, renderTarget, output, clearMode);
6865

src/tilt-shift/tilt-shift.frag

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
precision highp float;
12
in vec2 vTextureCoord;
23
out vec4 finalColor;
34

@@ -6,7 +7,7 @@ uniform vec2 uBlur;
67
uniform vec2 uStart;
78
uniform vec2 uEnd;
89
uniform vec2 uDelta;
9-
uniform vec2 uDimensions;
10+
uniform vec4 uInputSize;
1011

1112
float random(vec3 scale, float seed)
1213
{
@@ -23,13 +24,13 @@ void main(void)
2324

2425
float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);
2526
vec2 normal = normalize(vec2(uStart.y - uEnd.y, uEnd.x - uStart.x));
26-
float radius = smoothstep(0.0, 1.0, abs(dot(vTextureCoord * uDimensions - uStart, normal)) / gradientBlur) * blur;
27+
float radius = smoothstep(0.0, 1.0, abs(dot(vTextureCoord * uInputSize.xy - uStart, normal)) / gradientBlur) * blur;
2728

2829
for (float t = -30.0; t <= 30.0; t++)
2930
{
3031
float percent = (t + offset - 0.5) / 30.0;
3132
float weight = 1.0 - abs(percent);
32-
vec4 sample = texture(uTexture, vTextureCoord + uDelta / uDimensions * percent * radius);
33+
vec4 sample = texture(uTexture, vTextureCoord + uDelta / uInputSize.xy * percent * radius);
3334
sample.rgb *= sample.a;
3435
color += sample * weight;
3536
total += weight;

src/tilt-shift/tilt-shift.wgsl

+8-4
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,14 @@ struct TiltShiftUniforms {
33
uStart: vec2<f32>,
44
uEnd: vec2<f32>,
55
uDelta: vec2<f32>,
6-
uDimensions: vec2<f32>,
76
};
87

8+
struct GlobalFilterUniforms {
9+
uInputSize:vec4<f32>,
10+
};
11+
12+
@group(0) @binding(0) var<uniform> gfu: GlobalFilterUniforms;
13+
914
@group(0) @binding(1) var uTexture: texture_2d<f32>;
1015
@group(0) @binding(2) var uSampler: sampler;
1116
@group(1) @binding(0) var<uniform> tiltShiftUniforms : TiltShiftUniforms;
@@ -20,20 +25,19 @@ fn mainFragment(
2025
let uStart = tiltShiftUniforms.uStart;
2126
let uEnd = tiltShiftUniforms.uEnd;
2227
let uDelta = tiltShiftUniforms.uDelta;
23-
let uDimensions = tiltShiftUniforms.uDimensions;
2428

2529
var color: vec4<f32> = vec4<f32>(0.0);
2630
var total: f32 = 0.0;
2731

2832
let offset: f32 = random(position, vec3<f32>(12.9898, 78.233, 151.7182), 0.0);
2933
let normal: vec2<f32> = normalize(vec2<f32>(uStart.y - uEnd.y, uEnd.x - uStart.x));
30-
let radius: f32 = smoothstep(0.0, 1.0, abs(dot(uv * uDimensions - uStart, normal)) / uBlurGradient) * uBlur;
34+
let radius: f32 = smoothstep(0.0, 1.0, abs(dot(uv * gfu.uInputSize.xy - uStart, normal)) / uBlurGradient) * uBlur;
3135

3236
for (var t: f32 = -30.0; t <= 30.0; t += 1.0)
3337
{
3438
var percent: f32 = (t + offset - 0.5) / 30.0;
3539
var weight: f32 = 1.0 - abs(percent);
36-
var sample: vec4<f32> = textureSample(uTexture, uSampler, uv + uDelta / uDimensions * percent * radius);
40+
var sample: vec4<f32> = textureSample(uTexture, uSampler, uv + uDelta / gfu.uInputSize.xy * percent * radius);
3741
sample = vec4<f32>(sample.xyz * sample.a, sample.a); // multiply sample.rgb with sample.a
3842
color += sample * weight;
3943
total += weight;

0 commit comments

Comments
 (0)