Jump to content
  • Advertisement
Sign in to follow this  
Miguel71

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

This topic is 1725 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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
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.

Share this post


Link to post
Share on other sites

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

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
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!