diffuse and specular functions (still needs testing)