Pimax started the 8K campaign on the basis of new panels and a decision to make wide field of view. There was notable difficulty with the new panels, leading to the 80Hz and now subpixel pattern debacles. Let’s see what can be done with what we do have.
First, a description of what can be physically displayed: There exists a 3840x2160 grid. Within this grid, no pixels have full colour. By what I’ve been able to make out, it appears to have checkerboard patterns for all colours; effectively, every second pixel is absent. The lines of same coloured pixels are diagonal, so the actual display pixel is a “diamond” shape; a normal square rotated 45 degrees and scaled up by √2. It is probable that the subpixels are displaced in relation to each other, but the chromatic aberration of the lens makes that shift all over the screen; it averages out.
The first problem is that we’re feeding the panel 4K RGB when it can only display half of that. This is currently done by a separate upscaler chip, converting 2560x1440 into 3840x2160, and somewhere along the way hitting a rate limit such that it can only operate in 80Hz. So we want to design a way to have the panel show every byte of input data.
If the panel is something like AU Optronics H546UAN01.0, there is a bit of built in processing to support 1080 input. What we’d be looking for is a way to enable pixel doubling in one axis. So look for pixel doubling, nearest neighbour, 3840x1080 or 1920x2160. If we find such a mode, this cuts the bitrate from the scaler to the panel by half and gets rid of the blurring the panel adds if it blends in the pixels it was unable to display.
At that point, we have full RGB, but every other scanline is offset and our pixels are double width. The combination is not something the scaler can handle. However, we’re dealing with 4.1Mpixel instead of 8.3Mpixel (befuddling rounding). Our source image is currently 3.7Mpixel. This is the level we really want to play porch tricks; our scaler chip should be capable of placing a smaller image within the display region, and we don’t use the full extent of the panel. Let’s optimistically assume this is possible, and our image region actually shrinks, perhaps to 3456x1080 or 1728x2160. This puts us at 3.7Mpixel, and suddenly the scaler is working for us, not against!
That our red, green and blue channels are differently placed is not a big issue. This can be compensated for by simply shifting the lens center in the lens warp, because it processes the channels individually to compensate for chromatic aberration already. That the pixels are the a diamond shape, and offset every other line, is a little trickier.
One way to see our subpixel layout is that we have overlapping ordinary grids; this is the approach taken in e.g. Bayer decoding as G1-R-B-G2. Overlapping images are expensive to render. Another view is that it is really a regular grid that’s rotated 45 degrees and has 45 degree slanted sides. GPUs are great at rotating things.
So, we rotate our render buffer. Our formerly largest size, horizontal, is now diagonal. So we’ve in general enlarged our render buffer by something like √2. But now that we’re properly aligned, what looked like full pixel gaps has become just √2 larger pixels. We’re at a more native size. Also, supersampling has started hitting the correct region. We have much larger unused regions in our render buffer, but we cover those up with the occlusion mesh, that was rotated along with the rendering perspective. Our lens warp will reverse the rotation and apply the per-scanline offset for readout buffer format.
So we’ve redefined our render buffer from something approximating 2560x1440 (with some factor to compensate for lens) to something related to 1920x2160 rotated 45 degrees, fitting in a buffer about 2885 pixels across but not using the corners. We’re likely paying a little overhead from cut off tiles at the edges, but that already happens with the occlusion mesh.
This is all very hacky, but the end result is a clean rendering with no extra blur. If it can be deployed, depending on properties of the scaler, panel, and their setup sequences.