Bingo!
My original understanding of UV mapping was indeed wrong, but it doesn’t matter. @StarCrunch your link to the psx_retroshader turned out to be all I needed! Down at the bottom of that page is a screenshot that confirmed the results I was seeing are to be expected and that more triangles is all that’s needed, so I went with it. My cubes now consist 24 triangles per face, which is enough to both fix the checker map, AND add the perspective that I was hoping this number of UVs would give me. Perfect!
I’ll do a proper video of this running on Android, but for now https://development.qweb.co.uk/test4/
Not sure how well a HTML build of this will run… it seems fine for me, but in general the HTML builds never perform as good and this is now a 576 poly scene (48 each for the 3 cubes directly in front of the camera, 72 each for the other 6 because off-screen faces still aren’t culled yet). That front cube should rotate half a degree every 20ms, which is about one full rotation every 14.5 seconds.
There’s definitely room for optimisation in this now so if it’s already performing well enough for people in general, then that’s fantastic.