I want to know what's the most efficient way to implement low poly style flat shading. I have checked this post, however the options listed in the page don't feel perfect to me. I list them below for reference.
- Duplicate each vertex so that same vertex can associate with a different normal.
- Use
flat
to disable interpolation. - Evaluate normal at fragment shader using
dFdx
anddFdy
.
To me, option 1 wastes some vertex attributes, since duplicate vertices have the same position. Option 3 perform unnecessary calculation on every fragment even though the normal should all be the same. Option 2 feels conceptually right to me, but I don't know what normal value should be saved at each vertex. This is also the approach hinted in book 'Real Time Rendering' (4e, p120).
My question is: what's the best way to implement it? Given so many commercial games used this style, I want to know how it is typically implemented by real world games?