You only send the MVP once (per draw) it doesnt change depending on the verticies its uniform
You only send the position offset once per draw too.
Because your application will require more transformations than just a translation if it's even remotely sophisticated.
Also, GPUs were designed to be fast at matrix operations, they aren't evil.
I thought the case we were talking about was just moving an object around. I've been using this when I only need to translate an object, I don't see why it warrants a comment like "I sincerely hope this was a crude attempt at humour".
If you only need to translate, I postulate that it is faster to only send the MVP when the camera moves and update a uniform vec2 for each object's translation.
And the matrix multiplication to construct the MVP would be done before sending to the GPU, so I don't know where your last comment came from about the GPU being good at matrix operations.
Edited:
Pseudocode:
Code:
set up new camera/perspective based on camera position when the camera moves
vp = projection * view
setuniform( "vp", vp )
setuniform( "trans", model1_transformation )
draw( model1 )
setuniform( "trans", model2_transformation )
draw( model2 )
shader:
pos = vp * ( pos + trans )