PDA

View Full Version : Light on wrong faces



qwert
08-13-2001, 11:48 PM
First of all, excuse my bad english. Usually I talk and write in german...

I've got a light and some 3d objects like 3-dimensional ellipsis, on which I calculate the normals myself. The problem is, that the faces looking to the light are dark and the ones on the other side are lighten...
Are there some completely wrong initialisations?
Also, when I move the light the lighten faces keep looking the same.

Bob
08-14-2001, 01:54 AM
If the object is lit on the wrong side, it's probably your normals that are pointing in the wrong direction.

The other problems seems somewhat more strange. Maybe you aren't updating your scene? Are you doing any transformations to the projection matrix?

qwert
08-14-2001, 03:06 AM
thanks for reply,

but among the objects is a sphere, created with "gluSphere", which has got the same "symptoms". Could this "thing" appear with wrong light initialisations?

The other issue works now, the light moves.

Gruss

qwert
08-14-2001, 03:46 AM
Here is the code fragment for the light.
CGLLight::Render() is called by the main
render function. I enable the light each time to be sure they work if they are disabled somewhere else.


CGLLight::CGLLight(GLenum pname, float *params)
{
m_ltname = pname;
for (int i=0;i<4;i++)
m_params[i] = params[i];

m_lnumber = s_lnumber;
s_lnumber++;

m_Diffuse[0] = 0.5f;
m_Diffuse[1] = 0.5f;
m_Diffuse[2] = 0.5f;
m_Diffuse[3] = 1.0f;

m_Specular[0] = 1.0f;
m_Specular[1] = 1.0f;
m_Specular[2] = 1.0f;
m_Specular[3] = 1.0f;

}

void CGLLight::Render()
{
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0+m_lnumber);

glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);

glLightfv(GL_LIGHT0+m_lnumber, GL_DIFFUSE, m_Diffuse);
glLightfv(GL_LIGHT0+m_lnumber, GL_SPECULAR, m_Specular);

}
glLightfv(GL_LIGHT0+m_lnumber,m_ltname,m_params);

}

Dodger
08-14-2001, 04:45 AM
Are you sure the wrong faces are lit? Maybe the light source is just on the other side (happened to me once). For having e.g. the object rotate and the light source stay in one place, set the light position after you change the modelview matrix.

How are you creating your object? In code or import from a 3D application? Both could be reasons for messed up normals.

Bis die Tage http://www.opengl.org/discussion_boards/ubb/smile.gif

RedZen
08-14-2001, 04:52 AM
hmmm, for what it's worth, what I usually do, especially with more than one light, is draw big red Quads at the lights position. I make sure the quad and the light has the same coordinates at all time. Hereby you can always see exactly where the light is. Also, I had it happen more than once, and every time I want to kick myself in the nuts. The function that calculates youre normals...is that 100% correct. Sometimes I make a small mistake and the normals are technically speaking, inverted. Which causes crap as you can imagine. http://www.opengl.org/discussion_boards/ubb/smile.gif

qwert
08-14-2001, 05:23 AM
thanks for reply

I've got an object, which I calculate in my application, but I've got another object created with "gluSphere" which should have correct normals (The Sphere is inside my object). But both objects are lit the same wrong way (The light is outside).
I draw a line from the origin to my lightposition, but where the light should illuminate the object, everything is dark. Where it should be dark, the light "works".

But when I remove the line with "glLightfv(GL_LIGHT0+m_lnumber,m_ltname,m_params);" (m_ltname = GL_POSITION) the lightning is calculated correctly. But this way I can't move the light around...

RedZen
08-14-2001, 05:31 AM
Hehehe, man thats a kak one.
I don't think I know the answer.
Maybe ask one of the more advanced dudes, in advanced section??
Good luck.

qwert
08-14-2001, 05:34 AM
thanks anyway, RedZen, Dodger and Bob

DFrey
08-14-2001, 06:20 AM
That suggests that you changing the type of light it is. Remember for lights, if w=0, then the light is a directional light, otherwise it is a positional light. I suspect your m_params is incorrect.

Also this may be stating the obvious but it looks like there is a syntax error in your code as posted. Now obviously that error is not in your code else it wouldn't compile.

Also, I personally, would not put the glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE) call in the light class since material is a primitive's property and not a light's property.

Also, if this class is going to be used with real-time animation, you should cache a local copy of the important GL state variables, and only call into OpenGL when a state is changed, to prevent calling into OpenGL's state change code unecessarily.

qwert
08-15-2001, 09:34 PM
I'll do performance tuning, when I removed this ...

The debugger says that the w param of m_params is 1. So it should be a pointlight. After several starts I get a "Access Violation Error in G200ICD.DLL" (My graphics is a Matrox Millenium G200 http://www.opengl.org/discussion_boards/ubb/smile.gif ). Maybe a corrupt driver? But i don't think so...

Is there any OpenGL-initialisation who would turn things this way? Take the normals as their opposite or something?

qwert
08-16-2001, 02:25 AM
Ok Ok Ok...
all my fault.
I thought that the gluSphere would calculate the normals right by itself, but that's wrong. I had the wrong "gluQuadricOrientation"-statement. So both normals (sphere and ellipsis) were wrong. So stupid!

So, thanks for your replys!