Sign in to follow this  
Miguel71

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

Recommended Posts

Miguel71    116

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?

Share this post


Link to post
Share on other sites
michalferko    796

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.

Share this post


Link to post
Share on other sites
Miguel71    116

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

Edited by Miguel71

Share this post


Link to post
Share on other sites
Miguel71    116

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);

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this