Skip to content

Commit 6d64f42

Browse files
authored
Merge branch 'papadanku:main' into main
2 parents c0a2d01 + e720794 commit 6d64f42

File tree

5 files changed

+89
-57
lines changed

5 files changed

+89
-57
lines changed

shaders/cFlow.fx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,19 @@ CREATE_TEXTURE_POOLED(TempTex3_RG16F, BUFFER_SIZE_4, RG16F, 1)
5353
CREATE_TEXTURE_POOLED(TempTex4_RG16F, BUFFER_SIZE_5, RG16F, 1)
5454
CREATE_TEXTURE_POOLED(TempTex5_RG16F, BUFFER_SIZE_6, RG16F, 1)
5555

56-
CREATE_SAMPLER(SampleTempTex1, TempTex1_RG8, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
57-
CREATE_SAMPLER(SampleTempTex2a, TempTex2a_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
58-
CREATE_SAMPLER(SampleTempTex2b, TempTex2b_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
59-
CREATE_SAMPLER(SampleTempTex3, TempTex3_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
60-
CREATE_SAMPLER(SampleTempTex4, TempTex4_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
61-
CREATE_SAMPLER(SampleTempTex5, TempTex5_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
56+
CREATE_SAMPLER(SampleTempTex1, TempTex1_RG8, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
57+
CREATE_SAMPLER(SampleTempTex2a, TempTex2a_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
58+
CREATE_SAMPLER(SampleTempTex2b, TempTex2b_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
59+
CREATE_SAMPLER(SampleTempTex3, TempTex3_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
60+
CREATE_SAMPLER(SampleTempTex4, TempTex4_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
61+
CREATE_SAMPLER(SampleTempTex5, TempTex5_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
6262

6363
CREATE_TEXTURE(Tex2c, BUFFER_SIZE_3, RG8, 8)
64-
CREATE_SAMPLER(SampleTex2c, Tex2c, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
64+
CREATE_SAMPLER(SampleTex2c, Tex2c, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
6565

6666
CREATE_TEXTURE(OFlowTex, BUFFER_SIZE_3, RG16F, 1)
67-
CREATE_SAMPLER(SampleOFlowTex, OFlowTex, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
68-
CREATE_SAMPLER(SampleFlow, TempTex2a_RG16F, FLOW_SAMPLER_FILTER, FLOW_SAMPLER_FILTER, LINEAR, MIRROR, MIRROR, MIRROR)
67+
CREATE_SAMPLER(SampleOFlowTex, OFlowTex, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
68+
CREATE_SAMPLER(SampleFlow, TempTex2a_RG16F, FLOW_SAMPLER_FILTER, FLOW_SAMPLER_FILTER, LINEAR, CLAMP, CLAMP, CLAMP)
6969

7070
// This is for LCI.
7171
CREATE_TEXTURE(NoiseTex, BUFFER_SIZE_0, R16, 0)

shaders/cMotionBlur.fx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ uniform float _Scale <
3939
ui_label = "Scale";
4040
ui_type = "slider";
4141
ui_min = 0.0;
42-
ui_max = 4.0;
43-
> = 2.0;
42+
ui_max = 2.0;
43+
> = 1.0;
4444

4545
uniform float _TargetFrameRate <
4646
ui_category = "Shader | Motion Blur";
@@ -70,18 +70,18 @@ CREATE_TEXTURE_POOLED(TempTex3_RG16F, BUFFER_SIZE_4, RG16F, 1)
7070
CREATE_TEXTURE_POOLED(TempTex4_RG16F, BUFFER_SIZE_5, RG16F, 1)
7171
CREATE_TEXTURE_POOLED(TempTex5_RG16F, BUFFER_SIZE_6, RG16F, 1)
7272

73-
CREATE_SAMPLER(SampleTempTex1, TempTex1_RG8, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
74-
CREATE_SAMPLER(SampleTempTex2a, TempTex2a_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
75-
CREATE_SAMPLER(SampleTempTex2b, TempTex2b_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
76-
CREATE_SAMPLER(SampleTempTex3, TempTex3_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
77-
CREATE_SAMPLER(SampleTempTex4, TempTex4_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
78-
CREATE_SAMPLER(SampleTempTex5, TempTex5_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
73+
CREATE_SAMPLER(SampleTempTex1, TempTex1_RG8, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
74+
CREATE_SAMPLER(SampleTempTex2a, TempTex2a_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
75+
CREATE_SAMPLER(SampleTempTex2b, TempTex2b_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
76+
CREATE_SAMPLER(SampleTempTex3, TempTex3_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
77+
CREATE_SAMPLER(SampleTempTex4, TempTex4_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
78+
CREATE_SAMPLER(SampleTempTex5, TempTex5_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
7979

8080
CREATE_TEXTURE(Tex2c, BUFFER_SIZE_3, RG8, 8)
81-
CREATE_SAMPLER(SampleTex2c, Tex2c, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
81+
CREATE_SAMPLER(SampleTex2c, Tex2c, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
8282

8383
CREATE_TEXTURE(OFlowTex, BUFFER_SIZE_3, RG16F, 1)
84-
CREATE_SAMPLER(SampleOFlowTex, OFlowTex, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
84+
CREATE_SAMPLER(SampleOFlowTex, OFlowTex, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
8585

8686
/*
8787
[Pixel Shaders]

shaders/cMotionStabilization.fx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,18 @@ CREATE_TEXTURE_POOLED(TempTex3_RG16F, BUFFER_SIZE_4, RG16F, 1)
5555
CREATE_TEXTURE_POOLED(TempTex4_RG16F, BUFFER_SIZE_5, RG16F, 1)
5656
CREATE_TEXTURE_POOLED(TempTex5_RG16F, BUFFER_SIZE_6, RG16F, 1)
5757

58-
CREATE_SAMPLER(SampleTempTex1, TempTex1_RG8, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
59-
CREATE_SAMPLER(SampleTempTex2a, TempTex2a_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
60-
CREATE_SAMPLER(SampleTempTex2b, TempTex2b_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
61-
CREATE_SAMPLER(SampleTempTex3, TempTex3_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
62-
CREATE_SAMPLER(SampleTempTex4, TempTex4_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
63-
CREATE_SAMPLER(SampleTempTex5, TempTex5_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
58+
CREATE_SAMPLER(SampleTempTex1, TempTex1_RG8, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
59+
CREATE_SAMPLER(SampleTempTex2a, TempTex2a_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
60+
CREATE_SAMPLER(SampleTempTex2b, TempTex2b_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
61+
CREATE_SAMPLER(SampleTempTex3, TempTex3_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
62+
CREATE_SAMPLER(SampleTempTex4, TempTex4_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
63+
CREATE_SAMPLER(SampleTempTex5, TempTex5_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
6464

6565
CREATE_TEXTURE(Tex2c, BUFFER_SIZE_3, RG8, 8)
66-
CREATE_SAMPLER(SampleTex2c, Tex2c, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
66+
CREATE_SAMPLER(SampleTex2c, Tex2c, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
6767

6868
CREATE_TEXTURE(OFlowTex, BUFFER_SIZE_3, RG16F, 1)
69-
CREATE_SAMPLER(SampleOFlowTex, OFlowTex, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
69+
CREATE_SAMPLER(SampleOFlowTex, OFlowTex, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
7070

7171
CREATE_SRGB_SAMPLER(SampleStableTex, CShade_ColorTex, STABILIZATION_FILTER, STABILIZATION_FILTER, STABILIZATION_FILTER, STABILIZATION_ADDRESS, STABILIZATION_ADDRESS, STABILIZATION_ADDRESS)
7272

@@ -139,7 +139,7 @@ float4 PS_MotionStabilization(CShade_VS2PS_Quad Input) : SV_TARGET0
139139
float2 MotionVectors = CMath_Float2_FP16ToNorm(tex2Dlod(SampleTempTex2a, float4(0.5, 0.0, 0.0, 99.0)).xy);
140140

141141
float2 StableTex = Input.Tex0.xy - 0.5;
142-
StableTex += (MotionVectors * _Stabilization);
142+
StableTex -= (MotionVectors * _Stabilization);
143143
StableTex += 0.5;
144144

145145
float4 Color = CShadeHDR_Tex2D_InvTonemap(SampleStableTex, StableTex);

shaders/kDatamosh.fx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,22 +128,22 @@ CREATE_TEXTURE_POOLED(TempTex3_RG16F, BUFFER_SIZE_4, RG16F, 1)
128128
CREATE_TEXTURE_POOLED(TempTex4_RG16F, BUFFER_SIZE_5, RG16F, 1)
129129
CREATE_TEXTURE_POOLED(TempTex5_RG16F, BUFFER_SIZE_6, RG16F, 1)
130130

131-
CREATE_SAMPLER(SampleTempTex1, TempTex1_RG8, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
132-
CREATE_SAMPLER(SampleTempTex2a, TempTex2a_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
133-
CREATE_SAMPLER(SampleTempTex2b, TempTex2b_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
134-
CREATE_SAMPLER(SampleTempTex3, TempTex3_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
135-
CREATE_SAMPLER(SampleTempTex4, TempTex4_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
136-
CREATE_SAMPLER(SampleTempTex5, TempTex5_RG16F, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
137-
CREATE_SAMPLER(SampleFilteredFlowTex, TempTex2a_RG16F, DISPLACEMENT_FILTERING, DISPLACEMENT_FILTERING, LINEAR, MIRROR, MIRROR, MIRROR)
131+
CREATE_SAMPLER(SampleTempTex1, TempTex1_RG8, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
132+
CREATE_SAMPLER(SampleTempTex2a, TempTex2a_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
133+
CREATE_SAMPLER(SampleTempTex2b, TempTex2b_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
134+
CREATE_SAMPLER(SampleTempTex3, TempTex3_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
135+
CREATE_SAMPLER(SampleTempTex4, TempTex4_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
136+
CREATE_SAMPLER(SampleTempTex5, TempTex5_RG16F, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
138137

139138
CREATE_TEXTURE(Tex2c, BUFFER_SIZE_3, RG8, 8)
140139
CREATE_TEXTURE(OFlowTex, BUFFER_SIZE_3, RG16F, 1)
141140
CREATE_TEXTURE(AccumTex, BUFFER_SIZE_0, R16F, 1)
142141
CREATE_TEXTURE(FeedbackTex, BUFFER_SIZE_0, RGBA8, 1)
143142

144-
CREATE_SAMPLER(SampleTex2c, Tex2c, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
145-
CREATE_SAMPLER(SampleOFlowTex, OFlowTex, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
146-
CREATE_SAMPLER(SampleAccumTex, AccumTex, DISPLACEMENT_FILTERING, DISPLACEMENT_FILTERING, LINEAR, MIRROR, MIRROR, MIRROR)
143+
CREATE_SAMPLER(SampleTex2c, Tex2c, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
144+
CREATE_SAMPLER(SampleOFlowTex, OFlowTex, LINEAR, LINEAR, LINEAR, CLAMP, CLAMP, CLAMP)
145+
CREATE_SAMPLER(SampleFilteredFlowTex, TempTex2a_RG16F, DISPLACEMENT_FILTERING, DISPLACEMENT_FILTERING, LINEAR, CLAMP, CLAMP, CLAMP)
146+
CREATE_SAMPLER(SampleAccumTex, AccumTex, DISPLACEMENT_FILTERING, DISPLACEMENT_FILTERING, LINEAR, CLAMP, CLAMP, CLAMP)
147147

148148
CREATE_SRGB_SAMPLER(SampleSourceTex, CShade_ColorTex, WARP_FILTERING, WARP_FILTERING, LINEAR, MIRROR, MIRROR, MIRROR)
149149
CREATE_SRGB_SAMPLER(SampleFeedbackTex, FeedbackTex, LINEAR, LINEAR, LINEAR, MIRROR, MIRROR, MIRROR)
@@ -307,7 +307,7 @@ float4 PS_Datamosh(CShade_VS2PS_Quad Input) : SV_TARGET0
307307

308308
// Color from the original image
309309
float4 Source = CShadeHDR_Tex2D_InvTonemap(CShade_SampleColorTex, Input.Tex0);
310-
float4 Work = CShadeHDR_Tex2D_InvTonemap(SampleFeedbackTex, Input.Tex0 - MV);
310+
float4 Work = CShadeHDR_Tex2D_InvTonemap(SampleFeedbackTex, Input.Tex0 + MV);
311311

312312
// Generate some pseudo random numbers.
313313
float4 Rand = frac(float4(1.0, 17.37135, 841.4272, 3305.121) * RandomMotion);

shaders/shared/cMotionEstimation.fxh

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,37 @@
1313
- The post-filter median filter is 2^3 pixels wide.
1414
- This idea is based off depth-of-field undersampling and using a post-filter median on the undersampled regions.
1515
*/
16-
float4 CMotionEstimation_GetDilatedPyramidUpsample(sampler2D Source, float2 Tex)
16+
float4 CMotionEstimation_GetDilatedPyramidUpsample(sampler2D SampleSource, float2 Tex)
1717
{
18-
return CBlur_FilterMotionVectors(Source, Tex, 3.0, false);
18+
// A0 B0 C0
19+
// A1 B1 C1
20+
// A2 B2 C2
21+
float2 Delta = fwidth(Tex) * exp2(2.0);
22+
float4 Tex0 = Tex.xyyy + (float4(-2.0, 2.0, 0.0, -2.0) * Delta.xyyy);
23+
float4 Tex1 = Tex.xyyy + (float4(0.0, 2.0, 0.0, -2.0) * Delta.xyyy);
24+
float4 Tex2 = Tex.xyyy + (float4(2.0, 2.0, 0.0, -2.0) * Delta.xyyy);
25+
26+
float4 Sum = 0.0;
27+
float Weight = 1.0 / 9.0;
28+
Sum += (tex2D(SampleSource, Tex0.xy) * Weight);
29+
Sum += (tex2D(SampleSource, Tex0.xz) * Weight);
30+
Sum += (tex2D(SampleSource, Tex0.xw) * Weight);
31+
Sum += (tex2D(SampleSource, Tex1.xy) * Weight);
32+
Sum += (tex2D(SampleSource, Tex1.xz) * Weight);
33+
Sum += (tex2D(SampleSource, Tex1.xw) * Weight);
34+
Sum += (tex2D(SampleSource, Tex2.xy) * Weight);
35+
Sum += (tex2D(SampleSource, Tex2.xz) * Weight);
36+
Sum += (tex2D(SampleSource, Tex2.xw) * Weight);
37+
38+
return Sum;
1939
}
2040

2141
/*
2242
Lucas-Kanade optical flow with bilinear fetches.
2343
---
44+
Gauss-Newton Steepest Descent Inverse Additive Algorithm
45+
https://www.ri.cmu.edu/pub_files/pub3/baker_simon_2002_3/baker_simon_2002_3.pdf
46+
---
2447
The algorithm is motified to not output in pixels, but normalized displacements
2548
---
2649
Calculate Lucas-Kanade optical flow by solving (A^-1 * B)
@@ -36,8 +59,8 @@
3659
float2 MainPos,
3760
float2 MainTex,
3861
float2 Vectors,
39-
sampler2D SampleI0,
40-
sampler2D SampleI1
62+
sampler2D SampleT,
63+
sampler2D SampleI
4164
)
4265
{
4366
// Initialize variables
@@ -56,7 +79,7 @@
5679

5780
// Calculate warped texture coordinates
5881
WarpTex.zw -= 0.5; // Pull into [-0.5, 0.5) range
59-
WarpTex.zw += Vectors; // Warp in [-HalfMax, HalfMax) range
82+
WarpTex.zw -= Vectors; // Inverse warp in the [-0.5, 0.5) range
6083
WarpTex.zw = saturate(WarpTex.zw + 0.5); // Push and clamp into [0.0, 1.0) range
6184

6285
// Get gradient information
@@ -82,19 +105,19 @@
82105

83106
// Get temporal gradient
84107
float4 TexIT = WarpTex.xyzw + (Kernel.xyxy * PixelSize.xyxy);
85-
float2 I0 = tex2Dgrad(SampleI0, TexIT.xy, TexIx.xy, TexIy.xy).rg;
86-
float2 I1 = tex2Dgrad(SampleI1, TexIT.zw, TexIx.zw, TexIy.zw).rg;
87-
float2 IT = I0 - I1;
108+
float2 T = tex2Dgrad(SampleT, TexIT.xy, TexIx.xy, TexIy.xy).rg;
109+
float2 I = tex2Dgrad(SampleI, TexIT.zw, TexIx.zw, TexIy.zw).rg;
110+
float2 IT = I - T;
88111

89112
// Get spatial gradient
90113
float4 OffsetNS = Kernel.xyxy + float4(0.0, -1.0, 0.0, 1.0);
91114
float4 OffsetEW = Kernel.xyxy + float4(-1.0, 0.0, 1.0, 0.0);
92115
float4 NS = WarpTex.xyxy + (OffsetNS * PixelSize.xyxy);
93116
float4 EW = WarpTex.xyxy + (OffsetEW * PixelSize.xyxy);
94-
float2 N = tex2Dgrad(SampleI0, NS.xy, TexIx.xy, TexIy.xy).rg;
95-
float2 S = tex2Dgrad(SampleI0, NS.zw, TexIx.xy, TexIy.xy).rg;
96-
float2 E = tex2Dgrad(SampleI0, EW.xy, TexIx.xy, TexIy.xy).rg;
97-
float2 W = tex2Dgrad(SampleI0, EW.zw, TexIx.xy, TexIy.xy).rg;
117+
float2 N = tex2Dgrad(SampleT, NS.xy, TexIx.xy, TexIy.xy).rg;
118+
float2 S = tex2Dgrad(SampleT, NS.zw, TexIx.xy, TexIy.xy).rg;
119+
float2 E = tex2Dgrad(SampleT, EW.xy, TexIx.xy, TexIy.xy).rg;
120+
float2 W = tex2Dgrad(SampleT, EW.zw, TexIx.xy, TexIy.xy).rg;
98121
float2 Ix = E - W;
99122
float2 Iy = N - S;
100123

@@ -115,13 +138,22 @@
115138
[-IxIy/D Iy^2/D] [-IyIt]
116139
*/
117140

118-
// Calculate A^-1 and B
119-
float D = determinant(float2x2(IxIx, IxIy, IxIy, IyIy));
120-
float2x2 A = float2x2(IyIy, -IxIy, -IxIy, IxIx) / D;
121-
float2 B = float2(-IxIt, -IyIt);
141+
/*
142+
Calculate Lucas-Kanade matrix
143+
*/
144+
145+
// Construct matrices
146+
float2x2 A = float2x2(IxIx, IxIy, IxIy, IyIy);
147+
float2 B = float2(IxIt, IyIt);
148+
149+
// Calculate C factor
150+
float N = dot(B, B);
151+
float2 DotBA = float2(dot(B, A[0]), dot(B, A[1]));
152+
float D = dot(DotBA, B);
153+
float C = N / D;
122154

123-
// Calculate A^T*B
124-
float2 Flow = (D > 0.0) ? mul(B, A) : 0.0;
155+
// Calculate -C*B
156+
float2 Flow = (D > 0.0) ? -mul(C, B) : 0.0;
125157

126158
// Normalize motion vectors
127159
Flow *= PixelSize;

0 commit comments

Comments
 (0)