re: the UI blend mode is MEASURED -- the frames are drawn ADDITIVE
Closes the one route t32-blend-mode-not-on-disc.md left open: the executable's
draw path. Canary's UI draw capture now logs RB_BLENDCONTROL0 per draw, and the
game was driven to the main menu and to EXTRAS with F10 at each.
The title-side UI uses two blend states and ONE pixel shader:
0x07010701 src=ONE dst=1-SRC_ALPHA alpha-over (premultiplied)
ptbase, pteff05, the fade quad, ptmsg, ptmsg2, pttitle, buttons
0x01010101 src=ONE dst=ONE ADDITIVE
ptframe1, ptframe2, ptframe3, pteff20, both rotated sweep strips
Two controls, both run before the result was read:
* the NDC->pixel conversion that identifies a draw by its quad size reproduces
1134 and 1303 px for the two rotated sweep strips -- numbers measured by a
different tool in a different session -- on BOTH screens. The tool prints
PASS/FAIL and disclaims its own output on FAIL.
* pixel shader 0xE59B2B3DA4AA9008 is used with BOTH states, 12 draws additive
and 18 alpha-over. ptframe1 and ptbase run the same shader; only the blend
register differs. So this is a blend result, not a shader result.
This confirms the port's independent measurement -- it solved the composite per
pixel from two backgrounds and found additive halves alpha-over's error on both
frames -- by a route with nothing in common with it.
So the blend is no longer authored: 'any blend you choose is authored' was true
of the disc and is not true of the game. What is still unknown is which field
selects it; elements sharing a mode are batched into one draw call, so the
selection happens before the draw.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
This commit is contained in:
@@ -92,12 +92,19 @@ def main():
|
||||
w = (max(xs) - min(xs)) / 2 * W
|
||||
h = (max(ys) - min(ys)) / 2 * H
|
||||
heights.append(h)
|
||||
best, bd = "-", 1e9
|
||||
# A sprite is drawn at its native size or at 2x: the screen is
|
||||
# 1280x720 and the design space is 640x360, so `ptbase` (640x360)
|
||||
# covers the screen while `pteff05` (1280x720) is 1:1. Both are
|
||||
# tried and the scale is reported, because guessing one would
|
||||
# silently mis-name half the draws.
|
||||
best, bd, bs = "-", 1e9, 1
|
||||
for n, (sw, sh) in sizes.items():
|
||||
d = abs(sw - w) + abs(sh - h)
|
||||
if d < bd:
|
||||
best, bd = n, d
|
||||
tag = best if bd <= 6 else "(no match, nearest %s off %.0f)" % (best, bd)
|
||||
for sc in (1, 2):
|
||||
d = abs(sw * sc - w) + abs(sh * sc - h)
|
||||
if d < bd:
|
||||
best, bd, bs = n, d, sc
|
||||
tag = ("%s @%dx" % (best, bs)) if bd <= 8 else \
|
||||
"(no match, nearest %s @%dx off %.0f)" % (best, bs, bd)
|
||||
print("%4d %4d %4d 0x%08X %-20s %7.1f x %7.1f %s"
|
||||
% (idx, prim, nidx, raw, blend_name(raw), w, h, tag))
|
||||
tall = sorted(h for h in heights if h > 900)
|
||||
|
||||
Reference in New Issue
Block a user