Jump to content

  • Log In with Google      Sign In   
  • Create Account

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


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
7 replies to this topic

#1 Miguel71   Members   -  Reputation: 116

Like
0Likes
Like

Posted 26 October 2013 - 10:27 AM

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?



Sponsor:

#2 michalferko   Members   -  Reputation: 670

Like
1Likes
Like

Posted 26 October 2013 - 12:49 PM

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.



#3 Miguel71   Members   -  Reputation: 116

Like
0Likes
Like

Posted 26 October 2013 - 04:06 PM

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, 26 October 2013 - 04:07 PM.


#4 3TATUK2   Members   -  Reputation: 730

Like
1Likes
Like

Posted 26 October 2013 - 04:51 PM

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



#5 Miguel71   Members   -  Reputation: 116

Like
0Likes
Like

Posted 26 October 2013 - 05:00 PM

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

 

t7JbgGC.png

1aD1E7I.png



#6 3TATUK2   Members   -  Reputation: 730

Like
0Likes
Like

Posted 26 October 2013 - 05:06 PM

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



#7 Miguel71   Members   -  Reputation: 116

Like
0Likes
Like

Posted 26 October 2013 - 05:22 PM

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


#8 shacktar   Members   -  Reputation: 842

Like
0Likes
Like

Posted 27 October 2013 - 05:03 PM

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






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS