I'm basically attempting Specular Lighting in OpenTK (c# implementation of OpenGL) and I've managed to get Ambient and Diffuse lighting working, but now my calls to GL.getUniformLocation are returning -1 with the specular vector values (And I'm not sure "shininess" is being initialised correctly). I've looked into many types of documentation on OpenTK and OpenGL in regards to gl.getUniformLocation and why it can sometimes return a negative value and I'm "almost" sure that I'm using the specular uniform values correctly.
For clarity, here is the code straight from the solution using Microsoft Visual Studio 2010:
Vector3 lightDirection = new Vector3(0.1f, 0.0f, 0.0f);
Vector3 ambientIllumination = new Vector3(0.3f, 0.3f, 0.3f);
Vector3 ambientReflection = new Vector3(0.3f, 0.3f, 0.3f);
Vector3 diffuseIllumination = new Vector3(0.7f, 0.7f, 0.7f);
Vector3 diffuseReflection = new Vector3(0.7f, 0.7f, 0.7f);
Vector3 specularIllumination = new Vector3(0.5f, 0.5f, 0.5f);
Vector3 specularReflection = new Vector3(0.5f, 0.5f, 0.5f);
float shininess = 0.5f;
int lightDirectionLocation = GL.GetUniformLocation(shaderProgramID, "lightDirection");
GL.Uniform3(lightDirectionLocation, ref lightDirection);
int ambientIlluminationLocation = GL.GetUniformLocation(shaderProgramID, "ambientIllumination");
GL.Uniform3(ambientIlluminationLocation, ref ambientIllumination);
int ambientReflectionLocation = GL.GetUniformLocation(shaderProgramID, "ambientReflection");
GL.Uniform3(ambientReflectionLocation, ref ambientReflection);
int diffuseIlluminationLocation = GL.GetUniformLocation(shaderProgramID, "diffuseIllumination");
GL.Uniform3(diffuseIlluminationLocation, ref diffuseIllumination);
int diffuseReflectionLocation = GL.GetUniformLocation(shaderProgramID, "diffuseReflection");
GL.Uniform3(diffuseReflectionLocation, ref diffuseReflection);
int specularIlluminationLocation = GL.GetUniformLocation(shaderProgramID, "specularIllumination");
GL.Uniform3(specularIlluminationLocation, ref specularIllumination);
int specularReflectionLocation = GL.GetUniformLocation(shaderProgramID, "specularReflection");
GL.Uniform3(specularReflectionLocation, ref specularReflection);
int shininessLocation = GL.GetUniformLocation(shaderProgramID, "shininess");
GL.Uniform1(shininessLocation, shininess);
And the shader code that I'm using:
#version 150
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
uniform mat4 projMatrix;
// Light properties
uniform vec3 ambientIllumination;
uniform vec3 diffuseIllumination;
uniform vec3 specularIllumination;
uniform vec3 lightDirection;
// Material properties
uniform vec3 ambientReflection;
uniform vec3 diffuseReflection;
uniform vec3 specularReflection;
uniform float shininess;
in vec3 position;
in vec3 normal;
out vec3 Colour;
void main()
{
vec3 transformedNormal = normalize(vec3(viewMatrix * modelMatrix * vec4(normal, 0.0)));
vec3 surfaceToLight = normalize(vec3(viewMatrix * vec4(-lightDirection, 0.0)));
Colour = ambientIllumination * ambientReflection;
float normalDotLight = dot(transformedNormal, surfaceToLight);
if(normalDotLight > 0.0)
{
vec3 surfaceToEye = normalize(vec3(viewMatrix * modelMatrix * vec4(position, 1.0)));
Colour += specularIllumination * specularReflection * pow(max(dot(reflect(surfaceToLight, transformedNormal), surfaceToEye), 0.0), shininess);
Colour += diffuseIllumination * diffuseReflection * normalDotLight;
}
gl_Position = projMatrix * viewMatrix * modelMatrix * vec4(position, 1);
}