Though, how does Apple deal with the idea of 1 triangle per pixel (micropolygons)?![]()
Like this level of polys seems extreme, but then again it gets you out of having to have detailed texture maps, right?
Small polygons like that (as well as very thin/long triangles) are terrible for any GPU. Hardware processes triangles in rectangular batches for both rasterization and shading to make best possible use of its vector (SIMD) processing units. For example, most current GPUs (AMD, Nvidia, Apple) have ALU width of 32, so they have to shade 32 items/pixels at once. If a triangle does not cover all the pixels in such a batch, the hardware gets underutilized. So if a triangle only covers a single pixel, you still do 32 operations, but discard 31 of them. That’s really bad.
Actually, Apple should do considerably better in this case than others, since they collect pixels into tiles before doing the shading shading (that’s what DR in TBDR stands for). So small triangles will reduce the rasterizer efficiency, but the shaders will still be able to be executed efficiently (as they shade all pixels in a tile at once, not pixels in a triangle). Then again, Apple must bin the triangles into tiles first, so if you are bombarding your GPU with miriads of tiny triangles, you will quickly run it of the tile buffer space and trigger tile flushes which again is bad for performance.
Bottom line: using too many tiny tiny triangles is just a waste of GPU resources. If that’s what you need to do, maybe look into some sort of voxel rendering using compute shaders.