Skip to content

Commit b1f2827

Browse files
committed
box_sampler: update ETC_REPEAT
Signed-off-by: Ali Cheraghi <alichraghi@proton.me>
1 parent 6f74af2 commit b1f2827

File tree

1 file changed

+36
-12
lines changed

1 file changed

+36
-12
lines changed

include/nbl/builtin/hlsl/prefix_sum_blur/box_sampler.hlsl

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,26 @@ struct BoxSampler
4747
case ETC_REPEAT:
4848
{
4949
const uint32_t flooredMod = rightFlIdx % linearSize;
50-
const uint32_t ceiledMod = rightClIdx % linearSize;
5150
const T last = prefixSumAccessor.template get<T, uint32_t>(lastIdx);
52-
const T periodicOffset = (T(rightFlIdx) / linearSize) * last;
5351
const T floored = prefixSumAccessor.template get<T, uint32_t>(flooredMod);
54-
T ceiled = prefixSumAccessor.template get<T, uint32_t>(ceiledMod);
55-
if (flooredMod == lastIdx && ceiledMod == 0)
56-
ceiled += last;
57-
result += lerp(floored, ceiled, alpha) + periodicOffset;
52+
53+
result += (T(rightFlIdx) / linearSize) * last;
54+
55+
if (rightFlIdx == rightClIdx) // no flooring occurred
56+
{
57+
result += floored;
58+
}
59+
else if (flooredMod == lastIdx)
60+
{
61+
const T ceiled = prefixSumAccessor.template get<T, uint32_t>(0) + last;
62+
result += lerp(floored, ceiled, alpha);
63+
}
64+
else
65+
{
66+
const T ceiled = prefixSumAccessor.template get<T, uint32_t>(rightFlIdx + 1);
67+
result += lerp(floored, ceiled, alpha);
68+
}
69+
5870
break;
5971
}
6072
case ETC_CLAMP_TO_BORDER:
@@ -121,14 +133,26 @@ struct BoxSampler
121133
case ETC_REPEAT:
122134
{
123135
const uint32_t flooredMod = (linearSize + leftFlIdx) % linearSize;
124-
const uint32_t ceiledMod = (linearSize + leftClIdx) % linearSize;
125136
const T last = prefixSumAccessor.template get<T, uint32_t>(lastIdx);
126-
const T periodicOffset = (T(linearSize + leftClIdx) / T(linearSize)) * last;
127137
const T floored = prefixSumAccessor.template get<T, uint32_t>(flooredMod);
128-
T ceiled = prefixSumAccessor.template get<T, uint32_t>(ceiledMod);
129-
if (flooredMod == lastIdx && ceiledMod == 0)
130-
ceiled += last;
131-
result -= lerp(floored, ceiled, alpha) - periodicOffset;
138+
139+
result += (T(linearSize - leftClIdx) / T(linearSize)) * last;
140+
141+
if (rightFlIdx == rightClIdx) // no flooring occurred
142+
{
143+
result -= floored;
144+
}
145+
else if (flooredMod == lastIdx)
146+
{
147+
const T ceiled = prefixSumAccessor.template get<T, uint32_t>(0) + last;
148+
result -= lerp(floored, ceiled, alpha);
149+
}
150+
else
151+
{
152+
const T ceiled = prefixSumAccessor.template get<T, uint32_t>(rightFlIdx + 1);
153+
result -= lerp(floored, ceiled, alpha);
154+
}
155+
132156
break;
133157
}
134158
case ETC_CLAMP_TO_BORDER:

0 commit comments

Comments
 (0)