GLSL - Can't replace gl_LightSource[0].position with uniform

Started by
6 comments, last by shacktar 10 years, 5 months ago

Hi, I have a problem.

I'm trying to replace gl_LightSource[0].position with a uniform.

This is my Vertex shader


#version 120

//uniform float lightRadius;
uniform vec4 lightPosition;

varying vec3 lightDir;
varying vec3 viewDir;
varying vec3 normal;

void main()
{
    vec3 vertexPos = vec3(gl_ModelViewMatrix * gl_Vertex);
	
//vec3 lpos = lightPosition * gl_ModelViewMatrix;
vec3 lpos = gl_LightSource[0].position.xyz;
	
    lightDir = (lpos - vertexPos) / 50;
    viewDir = -vertexPos;
    normal = normalize(gl_NormalMatrix * gl_Normal);

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    gl_TexCoord[0] = gl_MultiTexCoord0;
}

That works but when i remove the coment on the first lpos and put it in the second it doesn't work well.


GLfloat g_lightPos[4] = {0.0f, 0.0f, 11.0f, 1.0f};
	glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_POSITION, g_lightPos);

	float amb[4] = {1.0f, 1.0f, 1.0f, 1.0f};
	float dif[4] = {0.8f, 0.8f, 0.8f, 1.0f};
	float emi[4] = {0.0f, 0.0f, 0.0f, 1.0f};
	float spe[4] = {0.0f, 0.0f, 0.0f, 1.0f};
	glMaterialfv(GL_FRONT, GL_AMBIENT, amb);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, dif);
	glMaterialfv(GL_FRONT, GL_EMISSION, emi);
    glMaterialfv(GL_FRONT, GL_SPECULAR, spe);
    glMaterialf(GL_FRONT, GL_SHININESS, 0.0f);

	shader.Use();
	glUniform1i(glGetUniformLocation(shader.ProgramID, "colorMap"), 0);
	glUniform4fv(glGetUniformLocation(shader.ProgramID, "lightPosition"), 1, g_lightPos);
	glUniform4f(glGetUniformLocation(shader.ProgramID, "amb"), 0.2f, 0.2f, 0.2f, 1.0f);
	glUniform4f(glGetUniformLocation(shader.ProgramID, "lights.diffuse"), 0.8f, 0.8f, 0.8f, 1.0f);
	level.Draw();

Can someone help me with this?

Advertisement

What does "does not work well" mean? First of all, your commented line is multiplying the position in the wrong order (should be matrix first, then vector) since you are using column vectors (see the vertexpos line). Another problem with your line is that you are assigning a vec4 (the result of multiplying a 4x4 with a 4x1 vector) into a vec3 variable. This should not compile and you should check the shader info log.

If it's something else, we need more information before we can help you.

Well i've fixed that. Thanks. Unfortunatly but it still is not working.


vec3 lpos = (gl_ModelViewMatrix * lightPosition).xyz;

Previously it was a bit strange, when i got away from it it became darker, but now it doesn't do that.

Now the light simply doesn't show up.

gl_LightSource[0].position.xyz

1S0YJki.png

uniform

Mg8ThgV.png

Did you try possibly without the modelviewmatrix transform? *shrug*

Yes I did, it does the same thing before I changed the multiplication order.

t7JbgGC.png

1aD1E7I.png

Are you sending 1.0 in as the .w component of the lightPosition vec4?

Yes I am. But it shouldn't matter since in both cases I only use the xyz components.


GLfloat g_lightPos[4] = {0.0f, 0.0f, 11.0f, 1.0f};
	
    glLightfv(GL_LIGHT0, GL_POSITION, g_lightPos);

	float amb[4] = {ambientLight.r, ambientLight.g, ambientLight.b, ambientLight.a};
	float dif[4] = {0.8f, 0.8f, 0.8f, 1.0f};
	float emi[4] = {0.0f, 0.0f, 0.0f, 1.0f};
	float spe[4] = {0.0f, 0.0f, 0.0f, 1.0f};
	glMaterialfv(GL_FRONT, GL_AMBIENT, amb);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, dif);
	glMaterialfv(GL_FRONT, GL_EMISSION, emi);
    glMaterialfv(GL_FRONT, GL_SPECULAR, spe);
    glMaterialf(GL_FRONT, GL_SHININESS, 0.0f);

	lightShader->Use();
	glUniform1i(glGetUniformLocation(lightShader->ProgramID, "colorMap"), 0);
	glUniform4fv(glGetUniformLocation(lightShader->ProgramID, "lightPosition"), 1, g_lightPos);
	glUniform4f(glGetUniformLocation(lightShader->ProgramID, "amb"), ambientLight.r, ambientLight.g, ambientLight.b, ambientLight.a);
	glUniform4f(glGetUniformLocation(lightShader->ProgramID, "lights.diffuse"), 0.8f, 0.8f, 0.8f, 1.0f);

	levelGeometry.Draw(&textures);

Have you tried seeing what glGetError reports? First, try calling glGetError after your call to glUniform4fv.

This topic is closed to new replies.

Advertisement