GLSL Lighting

I'm trying to add smooth lighting to my shader's functionality but can't seem to get it right( Screenshot: http://s15.postimg.org/6vmcxt9pn/lighting.png ). The thing that bothers me is the monkey at the top of the screen. The lighting on it isn't very smooth and is awkward, when compared to the guy at the bottom.

My shaders are:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Vertex Shader
#version 150 core

uniform mat4 Projection;
uniform mat4 View;
uniform mat4 Model;
uniform vec3 LightPosition_WS;
uniform vec4 Color;

in vec3 Position;
in vec4 VertexColor;
in vec2 TexCoord;
in vec3 Normal;

out vec4 InitColor;
out vec2 UV;
out vec3 Normal_CS;
out vec3 EyeDirection_CS;
out vec3 LightDirection_CS;
out vec3 Position_WS;

void main()
{
	//Regular Stuff
	mat4 PVM = Projection * View * Model;
	gl_Position = PVM * vec4( Position, 1 );
	InitColor = VertexColor * Color;
	UV = TexCoord;

	///Lighting
	Position_WS = ( Model * vec4(Position,1) ).xyz;

	vec3 Position_CS = ( View * Model * vec4(Position,1) ).xyz;
	EyeDirection_CS = -Position_CS;

	vec3 LightPosition_CS = ( View * vec4(LightPosition_WS,1) ).xyz;
	LightDirection_CS = LightPosition_CS + EyeDirection_CS;

	Normal_CS = ( transpose( inverse(Model) ) * vec4(Normal,0) ).xyz;
}


// Fragment Shader
#version 150 core

uniform sampler2D TexSamp;
uniform vec3 LightPosition_WS;
uniform vec3 LightColor;
uniform float LightPower;
uniform bool LightExists;
uniform bool UsingTex;

in vec4 InitColor; //Initial Color
in vec2 UV;
in vec3 Normal_CS;
in vec3 EyeDirection_CS;
in vec3 LightDirection_CS;
in vec3 Position_WS;

out vec4 FinalColor;

void main()
{

	vec4 MaterialColor;
	if ( UsingTex )
        MaterialColor = texture2D(TexSamp, UV) * InitColor;
    else
        MaterialColor = InitColor;

	vec3 Norm = normalize( Normal_CS );
	vec3 LDCS = normalize( LightDirection_CS );
	vec3 Ambient = vec3(.15, .15, .15) * MaterialColor.rgb;
	vec3 Specular = vec3(.3, .3, .3);
	vec3 Eye = normalize( EyeDirection_CS );
	vec3 Reflect = reflect( -LDCS, Norm );

	float CosTheta = clamp( dot( Norm, LDCS ), 0, 1 );
	float CosAlpha = clamp( dot( Eye, Reflect ), 0, 1 );
	float Distance = length( LightPosition_WS - Position_WS);
	float DistanceSquared = Distance * Distance;

	FinalColor =
	 Ambient +
	(Specular * LightPower * LightColor * CosAlpha )/DistanceSquared +
	(MaterialColor * LightPower * LightColor * CosTheta)/DistanceSquared;


	FinalColor[3] = MaterialColor[3]; //Lighting shouldn't change transperancy

	if ( !LightExists )
		FinalColor = MaterialColor;
}
closed account (o1vk4iN6)
They are both using the same shader ? It could be vertex normals, idk what program you used to create the models but usually programs have some sort of smoothing which computes the normals for you to make the surface appear smooth. At least that's how it is in 3ds max, it uses smoothing groups. Bit hard to make out the picture, maybe post a higher resolution with the objects more focused ?
Are you stretching/scaling the model along any axis? Because that distorts the normals.
Their using the same shader. I zoomed in on them and made separate images then placed them side by side: http://s14.postimg.org/wdwvmtdip/zoomed.png

Also, yead I am scaling the models but I thought that using Normal_CS = ( transpose( inverse(Model) ) * vec4(Normal,0) ).xyz; fixed the problem with scaling.
Topic archived. No new replies allowed.