title: light calculations in modelspace
body: <p>I have  a working per fragment lighting but I wonder what can I do to keep a lighting calculation in the modelspace where I don't have to multiply normals by normalModelMatrix as below in the fragment shader.</p>
  
  <p>Shaders: ViewMatrix - camera transformation, ModelMatrix - objects transfomation.
  Light position - glm::vec4 lightPos(3.0f, 2.0f, -30.0f, 1.0f)</p>
  
  <p>Render loop: </p>
  
  <pre><code>glUseProgram(ProgramId);
  glUniformMatrix4fv(ViewMatrixUniformLocation, 1, GL_FALSE, glm::value_ptr(ViewMatrix));
  glUniform4f(lightIntensityUniformLocation, 0.8f, 0.8f, 0.8f, 1.0f);
  glUniform4f(ambientIntensityUniformLocation, 0.2f, 0.2f, 0.2f, 0.2f);
  glUniform3fv(dirToLightUniformLocation, 1, glm::value_ptr( lightPos));
  
  ModelMatrixStack.push(ModelMatrix);
  ModelMatrix = glm::translate(ModelMatrix, glm::vec3(0, 0, -30));
  ModelMatrix = glm::rotate(ModelMatrix, 75.0f, glm::vec3(0,0,1)); 
  normMatrix = glm::mat3(ModelMatrix);
  glUniformMatrix4fv(ModelMatrixUniformLocation, 1, GL_FALSE,           
  glm::value_ptr(ModelMatrix));   
  glUniformMatrix3fv(normalModelMatrixUniformLocation, 1, GL_FALSE, 
  glm::value_ptr(normMatrix));
  drawTeapot();
  
  ModelMatrix = ModelMatrixStack.top();
  normMatrix = glm::mat3(ModelMatrix);
  
  glUniformMatrix4fv(ModelMatrixUniformLocation, 1, GL_FALSE,  
  glm::value_ptr(ModelMatrix));
  glUniformMatrix3fv(normalModelMatrixUniformLocation, 1, GL_FALSE,  
  glm::value_ptr(normMatrix));
  myground.draw();
  
  glUseProgram(0);
  </code></pre>
  
  <p>Vertex shader:</p>
  
  <pre><code>#version 400
  
  layout(location=0) in vec4 in_position;
  layout(location=1) in vec3 in_normal;
  out vec3 normal;
  out vec4 position;
  
  uniform mat4 ModelMatrix;
  uniform mat4 ViewMatrix;
  uniform mat4 ProjectionMatrix;
  
  void main(void)
  {
       vec4 vertexPosition = ModelMatrix * in_position;
       gl_Position = ProjectionMatrix * ViewMatrix * vertexPosition;
       normal = in_normal;
       position = vertexPosition;
  }
  </code></pre>
  
  <p>Fragment shader:</p>
  
  <pre><code>version 400
  
  in vec3 normal;
  in vec4 position;
  out vec4 outputColor;
  
  uniform vec3 lightPos;
  uniform vec4 lightIntensity;
  uniform vec4 ambientIntensity;
  uniform mat3 normalModelMatrix;
  
  void main(void)
  {
       vec3 normCamSpace = normalize(normalModelMatrix * normalize(normal));
       vec3 dirToLight = normalize(lightPos - vec3(position));
       float cosAngIncidence = dot(normCamSpace, dirToLight);
       cosAngIncidence = clamp(cosAngIncidence, 0, 1);
       outputColor = (lightIntensity * cosAngIncidence) + ambientIntensity;
  }
  </code></pre>