So I am getting an issue between my home computer and my school laptop with my shaders.
First off this will not run on my Nvidia NVS 4200M, it supports shader model 4.2, my home computer uses a ATI 5850. I can also confirm this happens on the Nvidia GTX 260
#version 330 core
layout(location = 0) in vec3 vertex;
layout(location = 1) in vec2 uv;
layout(location = 2) in vec3 normal;
out vec2 uv0;
out vec3 normal0;
out vec3 worldPos0;
uniform mat4 mvp;
uniform mat4 world;
void main()
{
gl_Position = mvp * vec4(vertex,1.0f);
uv0 = uv;
normal0 = world * vec4(normal,0.0f);
worldPos0 = world * vec4(vertex,1.0f);
}
However if I do this it will compile, but my fragment shader doesnt work on my Nvidia card, it works on my ATI 5850.
#version 330 core
layout(location = 0) in vec3 vertex;
layout(location = 1) in vec2 uv;
layout(location = 2) in vec3 normal;
out vec2 uv0;
out vec3 normal0;
out vec3 worldPos0;
uniform mat4 mvp;
uniform mat4 world;
void main()
{
gl_Position = mvp * vec4(vertex,1.0f);
uv0 = uv;
normal0 = (world * vec4(normal,0.0f)).xyz;
worldPos0 = (world * vec4(vertex,1.0f)).xyz;
}
My fragment shader compiled but when I set lighting to on, anything with this shader will not draw, it draws with lighting off however. Both methods work on my ATI card.
#version 330 core
struct Attenuation
{
int constant;
int linear;
int exponential;
};
struct BaseLight
{
vec4 colour;
float ambientIntensity;
float diffuseIntensity;
};
struct DirectionalLight
{
BaseLight base;
vec3 direction;
};
struct PointLight
{
BaseLight base;
vec3 position;
Attenuation attenuation;
};
vec3 CalcLightInternal(BaseLight _light, vec3 _lightDirection, vec3 _normal);
vec3 CalcDirectionalLight(vec3 _normal);
vec3 CalcPointLight(int _index, vec3 _normal);
const int MAX_POINT_LIGHTS = 5;
in vec2 uv0;
in vec3 normal0;
in vec3 worldPos0;
out vec3 finalColor;
uniform DirectionalLight directionalLight;
uniform PointLight pointLights[MAX_POINT_LIGHTS];
uniform int numPointLights;
uniform int lightingEnabled;
uniform vec3 cameraEyeWorldPosition;
uniform float specularIntensity;
uniform float specularPower;
uniform sampler2D diffusetexture;
void main()
{
vec3 MaterialDiffuseColor = texture2D(diffusetexture, uv0).rgb;
vec3 Normal = normalize(normal0);
if(lightingEnabled == 1)
{
vec3 TotalLight = CalcDirectionalLight(Normal);
for (int i = 0; i < numPointLights; i++)
{
TotalLight += CalcPointLight(i, Normal);
}
finalColor = MaterialDiffuseColor * TotalLight;
}
else
{
finalColor = MaterialDiffuseColor;
}
}
vec3 CalcLightInternal(BaseLight _light, vec3 _lightDirection, vec3 _normal)
{
vec3 AmbientColor = _light.colour.rgb * _light.ambientIntensity;
float DiffuseFactor = dot(normalize(_normal), _lightDirection);
vec3 DiffuseColor = vec3(0, 0, 0);
vec3 SpecularColor = vec3(0, 0, 0);
if (DiffuseFactor > 0)
{
DiffuseColor = _light.colour.rgb * _light.diffuseIntensity * DiffuseFactor;
vec3 VertexToEye = normalize(cameraEyeWorldPosition - worldPos0);
vec3 LightReflect = normalize(reflect(_lightDirection, _normal));
float SpecularFactor = dot(VertexToEye, LightReflect);
SpecularFactor = pow(SpecularFactor, specularPower);
if (SpecularFactor > 0)
{
SpecularColor = _light.colour.rgb * specularIntensity * SpecularFactor;
}
}
return (AmbientColor + DiffuseColor + SpecularColor);
}
vec3 CalcDirectionalLight(vec3 _normal)
{
return CalcLightInternal(directionalLight.base, directionalLight.direction, _normal);
}
vec3 CalcPointLight(int _index, vec3 _normal)
{
vec3 LightDirection = worldPos0 - pointLights[_index].position;
float Distance = length(LightDirection);
LightDirection = normalize(LightDirection);
vec3 Color = CalcLightInternal(pointLights[_index].base, LightDirection, _normal);
float Attenuation = pointLights[_index].attenuation.constant +
pointLights[_index].attenuation.linear * Distance +
pointLights[_index].attenuation.exponential * Distance * Distance;
return Color / Attenuation;
}
To be clear, this works on my ATI 5850