Diffuse shader problem

I have got a problem with diffuse light shader. Moving or rotating camera changes color on objects(light position is the same as camera position or something like that). I want to make stationary source of light.
This is the shader I’m using:


out vec4 outColor;
void main()
vec3 LightPosi = vec3(0, 0, 0);
vec4 DiffuseColor = vec4(1, 1, 1, 1);
vec3 EyeNormal = gl_NormalMatrix * gl_Normal;
vec4 VertPosi = gl_ModelViewMatrix * gl_Vertex;
vec3 VertexPosition = VertPosi.xyz/VertPosi.w;
vec3 LightDir = normalize(LightPosi - VertexPosition);
float diff = max(0, dot(EyeNormal, LightDir));
outColor.rgb = gl_Color.rgb + diff * DiffuseColor.rgb;
outColor.a = 1;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

-Fragment Shader

in vec4 outColor;
out vec4 FragColor;
void main()
FragColor = outColor;

This is wrong
vec3 VertexPosition = VertPosi.xyz/VertPosi.w;

The vertexposition should be in eye space just like your light position is supposed to be.
So, don’t divide by W

Now back to your light position. This variable should be multiplied by the camera matrix (the view part of the ModelView matrix). This is why mixing legacy OGL matricies with shaders is a bit painful and your better off supplying your own model and camera matricies instead of using ModelView.

Is there any other way to do it besides making my own matrices? What do you think about using built-in gl_LightSource[n].position or loading ModelView matrix after gluLookAt?

Honestly, if you are going to the trouble of making a shader then you’ll need to pass parameters (uniforms) at some point. When that happens it’s time to let go of the fixed function pipeline as much as possible. Sure, it’s really handy sometimes because you don’t have to create and track your own uniform variables. But, long term, the fixed function just gets in the way and doesn’t do what you want it to do.

Forget gl_LightSource[n].position and friends. These rely upon performing gllightv commands which inturn rely upon the current value of the ModelView matrix. Trust me, it’s better to start thinking of a strategy to roll your own matricies and uniforms sooner rather than later. When you have your own model matrix, camera matrix, etc you realise just how much freedom you have (especially when dealing with lighing and shadowing).

This topic was automatically closed 183 days after the last reply. New replies are no longer allowed.