Hey,
I just wanted to know if there is a way to shade a object flat without adding additional vertices / normals?
In OpenGL its easy, you just have to add the “flat” keyword to your normal in / out variable (Type Qualifier (GLSL) - OpenGL Wiki) to stop interpolation of normals.
Is there a way to do the same thing in cgshaders / shaderlab?
The only reliable cross-platform way I know to do this is to prevent having any shared vertices in the first place. Either duplicate vertices in your modelling program or, in Unity’s model import settings, set Normals to calculate and smoothing angle to zero, so that all the vertices of each face share the same face normal.
Another way (which as tanoshimi said might not be as cross-platform) is to use the partial derivative functions to calculate the surface normal inside the fragment shader. I posted that over here.