shader somewhat looks like this float PhongReflection(vec3 DirFromVertToLight, vec3 surfnormal, vec3 PerfectlyReflectedDir, vec3 DirVertexCam) { return 0.5*dot(DirFromVertToLight,surfnormal) + 0.8*dot(PerfectlyReflectedDir,DirVertexCam); } gl_FragColor = vec4(reflection_color,1.0)*PhongReflection(dfvtl, u_normalMap, Reflect(-dfvtl, vertex_normal), dvc);

I'm assuming the 0.5 and 0.8 are intensity tweaks?

One thing that comes to mind is that you're not clamping your dot products to 0-1 range. That means your specular result will be *removing* from your diffuse light whenever the dot product is negative. Same goes for diffuse.

Also the phong result should also be multiplied by the lambertian term for correctness, and taken to a power for glossiness.

It should look more like this (I've added your 0.5 and 0.8 to this, but I'm not sure you need or even want those):

float PhongReflection(vec3 DirFromVertToLight, vec3 surfnormal, vec3 PerfectlyReflectedDir, vec3 DirVertexCam) { float nDotL = clamp(dot(DirFromVertToLight,surfnormal), 0.0, 1.0); float rDotV = clamp(dot(PerfectlyReflectedDir,DirVertexCam), 0.0, 1.0); return 0.5*nDotL + (0.8 * nDotL * pow(rDotV, 32.0)); }

The 32 is the "glossiness". Higher = sharper highlights. Currently you're just using 1 which gives you a super spread out highlight.

Also, what is "reflection_color"? If all you want is the reflection highlight and not direct/diffuse lighting, then you don't need to add "0.5*nDotL" to that last line at all.