handoff: deliver ADDITIVE, and correct the 'any blend you choose is authored' instruction
HANDOFF gets the measured table, the two controls, the three caveats that travel with it (src=ONE is not evidence of premultiplied textures; the frames share a draw call so ptframe4 comes free; read it as per-element facts because the selecting field is still unknown), and the correction to the port's own sharpener -- 'neither frame has a fully-opaque pixel' is true and is not the discriminator, because pteff10 has none either and renders accurately. t32-blend-mode-not-on-disc.md keeps its negative and its reach and loses its conclusion. INDEX gets the row. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
This commit is contained in:
@@ -25,6 +25,67 @@ delivered.
|
||||
|
||||
|
||||
|
||||
## ✅ 2026-08-31 (later) — **ADDITIVE.** Measured off the GPU. Stop authoring it.
|
||||
|
||||
`ptframe1`, `ptframe2` and `ptframe3` are drawn with **`RB_BLENDCONTROL0 =
|
||||
0x01010101`** — src `ONE`, op `ADD`, dst `ONE`. **Additive.** Everything you
|
||||
render accurately is `0x07010701` — src `ONE`, dst `1−SRC_ALPHA`, alpha-over.
|
||||
|
||||
| blend | drawn this way |
|
||||
|---|---|
|
||||
| **`0x01010101` ADDITIVE** | **`ptframe1`, `ptframe2`, `ptframe3`**, `pteff20`, both rotated sweep strips |
|
||||
| `0x07010701` alpha-over | `ptbase`, `pteff05`, the fade quad, `ptmsg`, `ptmsg2`, `pttitle`, every button |
|
||||
| `0x00010001` opaque | the one non-UI blit that opens the frame |
|
||||
|
||||
Full page, both raw logs and the reference table:
|
||||
[`ui-blend-mode-measured.md`](../re/structures/ui-blend-mode-measured.md) ·
|
||||
[`data/ui-blend-mode-measured.txt`](../re/data/ui-blend-mode-measured.txt)
|
||||
|
||||
🔴 **This corrects the section below, which is still true about the disc and no
|
||||
longer the right instruction.** It told you *"any blend you choose is authored and
|
||||
must carry that label"*. That was right about the **disc** and wrong as guidance
|
||||
about the **game**: additive is now transcribed, not authored, and it should be
|
||||
labelled that way in `DECISIONS.md`.
|
||||
|
||||
✅ **Your own measurement got there first and it agrees.** You solved the
|
||||
composite per pixel from two backgrounds and ranked additive 34.305/28.948
|
||||
against alpha-over's 65.046/71.299. This is the register the GPU was actually
|
||||
handed. The two routes share nothing — a solved composite against a capture, and
|
||||
a hardware state read out of the command stream — so the agreement is worth more
|
||||
than either alone.
|
||||
|
||||
⚠️ **Three things to take with it.**
|
||||
|
||||
* **`src = ONE` in both states, not `SRC_ALPHA`.** The fixed-function stage
|
||||
multiplies your shader's output by 1, so whatever alpha weighting happens, the
|
||||
shader does it. Whether the `.t32` texels are stored premultiplied is a
|
||||
*separate* question and I have not read the shader. Do not conclude
|
||||
premultiplied textures from this.
|
||||
* **`ptframe1` and `ptframe2` are ONE draw call**, and so are `pteff20` +
|
||||
`ptframe3`. A draw call carries one blend state, so the game batches elements
|
||||
that share a mode. `ptframe4` needs no separate argument: it is inside the same
|
||||
additive batch as `ptframe3`.
|
||||
* **Read the table as per-element facts, not as a rule.** *Which field* selects
|
||||
the mode is still unknown — nothing on the disc does it, and the batching means
|
||||
the choice is made before the draw. Two additive menu draws (819×720 and
|
||||
691×720) are unidentified, and the **title screen was not captured**, so your
|
||||
outstanding "title has frame-like elements I haven't run" is still open on my
|
||||
side too.
|
||||
|
||||
⚠️ **Reach**: two screens, one session, one emulator. The identification is by
|
||||
quad size against disc dimensions, controlled against the two sweep strips
|
||||
measured at 1134/1303 px by a different tool in a different session — reproduced
|
||||
exactly, on both screens. And it is a blend result rather than a shader result:
|
||||
pixel shader `0xE59B2B3DA4AA9008` is used with **both** states, 12 draws additive
|
||||
and 18 alpha-over, so `ptframe1` and `ptbase` run the same shader.
|
||||
|
||||
⚠️ **One correction to your sharpener, because it will mislead the next reader.**
|
||||
You offered *"neither frame has a single fully-opaque pixel, against `ptbase`'s
|
||||
99.1 %"* as what makes them special. True, and **not the discriminator**:
|
||||
`pteff10` has max alpha **130**, is 100 % partial, has no opaque pixel either, and
|
||||
you measure it as nearly exact. `pteff12`, `pteff20`, `pteff21`–`23` are the same.
|
||||
The census is [`data/menu-sprite-alpha-census.txt`](../re/data/menu-sprite-alpha-census.txt).
|
||||
|
||||
## ❔ 2026-08-31 — your blend-mode ask: **not on the disc**. Whatever you pick is authored.
|
||||
|
||||
`ptframe1`/`ptframe2` carry **no blend/alpha mode** in any data I can find. Prior
|
||||
|
||||
Reference in New Issue
Block a user