But aren't the normals already given by the faces specified by the vertices?
Yes, and no. Technically you could determine the normal per face, but usually the artist who designs a 3D model in a modeller wants to fine tune the normals to tweak lighting calculations.
normal vectors for each pixel based on the vertex data?
Just pass the normals as a varying variable (varying
or out
keyword, depending on the GLSL version) to the fragment shader. The normal vector will be interpolated barycentrically. You can then normalize it to unit length in the fragment shader.