Question

I am having issues with per pixel lighting, as the light gets closer to the object it starts doing weird things like this https://i.stack.imgur.com/M8Txl.jpg.

Also when the camera gets too close i get artifacts like this https://i.stack.imgur.com/8KB67.jpg.

VertShader:

#version 330 core

layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec4 vertexColor;
layout(location = 2) in vec2 vertexTexCord;
layout(location = 3) in vec3 vertexNormal;

uniform mat4 MVP;
uniform mat4 V;
uniform mat4 P;
uniform mat4 M;
uniform vec3 PointLight1_Position;

out vec4 fragmentColor;
out vec2 UV;
out vec3 Position_worldspace;
out vec3 Normal_cameraspace;
out vec3 EyeDirection_cameraspace;
out vec3 LightDirection_cameraspace;

void main(){

    gl_Position =  MVP * vec4(vertexPosition_modelspace,1);

    Position_worldspace = ( M * vec4(vertexPosition_modelspace,1)).xyz;

    vec3 vertexPosition_cameraspace = ( V * M * vec4(vertexPosition_modelspace,1)).xyz;
    EyeDirection_cameraspace = - vertexPosition_cameraspace;

    vec3 LightPosition_cameraspace = ( V * vec4(PointLight1_Position,1)).xyz;
    LightDirection_cameraspace = LightPosition_cameraspace + EyeDirection_cameraspace;

    vec3 NormalPosition_cameraspace = ( V * M * vec4(vertexNormal,1)).xyz;
    Normal_cameraspace = -NormalPosition_cameraspace;


    fragmentColor = vertexColor;
    UV = vertexTexCord;
}

Fragment Shader:

#version 330 core

in vec4 fragmentColor;
in vec2 UV;
in vec3 Position_worldspace;
in vec3 Normal_cameraspace;
in vec3 EyeDirection_cameraspace;
in vec3 LightDirection_cameraspace;

out vec3 color;

uniform sampler2D TextureSampler1;
uniform vec3 PointLight1_Position;

void main()
{
    vec3 LightColor = vec3(1,1,1);
    float LightPower = 10.0f;

    vec3 MaterialDiffuseColor = texture2D(TextureSampler1, UV).rgb * fragmentColor.rgb;
    vec3 MaterialAmbientColor = vec3(0.1,0.1,0.1) * MaterialDiffuseColor;
    vec3 MaterialSpecularColor = vec3(0.3,0.3,0.3);

    float distance = length( PointLight1_Position - Position_worldspace );

    vec3 n = normalize( Normal_cameraspace );
    vec3 l = normalize( LightDirection_cameraspace );
    float cosTheta = clamp( dot( n,l ), 0,1 );

    vec3 E = normalize(EyeDirection_cameraspace);
    vec3 R = reflect(-l,n);
    float cosAlpha = clamp( dot( E,R ), 0,1 );

    color = 
        MaterialAmbientColor +
        MaterialDiffuseColor * LightColor * LightPower * cosTheta / (distance*distance) +
        MaterialSpecularColor * LightColor * LightPower * pow(cosAlpha,5) / (distance*distance);
}
Was it helpful?

Solution

I think you have an error here:

vec3 NormalPosition_cameraspace = ( V * M * vec4(vertexNormal,1)).xyz;
Normal_cameraspace = -NormalPosition_cameraspace;

You should construct a vec4 from vertexNormal using 0 as the fourth component (not 1). This effectively means that any translation is ignored when multiplying by your model/view matrices. This is what you want because the normal represents a direction, not a position.

Also, I don't understand this calculation:

LightDirection_cameraspace = LightPosition_cameraspace + EyeDirection_cameraspace;

Shouldn't this be something like:

LightDirection_cameraspace = LightPosition_cameraspace - vertexPosition_cameraspace;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top