I think my computer is possessed! (a seemingly harmless code changes lighting.)

Started by
4 comments, last by Lord_Evil 13 years, 12 months ago
Hi all in gamedevs! I had a really great help from this forum last time, and I'm looking if I can get your help again. Yeah, I think my computer is possessed. Has anyone else ever experience this problem? I'm using a downloaded code to learn OpenGL. I set my lighting, but it came out a lot darker than earlier. I'm still quite inexperienced in OpenGL, so I was playing around the code to see what was causing it... and my problem was in the most unexpected place. (code below... just skim to the /* HERE */) void InitializeOpenGL() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45,640/480,1,-100); glMatrixMode(GL_MODELVIEW); // Start Of User Initialization isClicked = false; // NEW: Clicking The Mouse? isDragging = false; // NEW: Dragging The Mouse? glClearDepth (1.0f); // Depth Buffer Setup glDepthFunc (GL_LEQUAL);// The Type Of Depth Testing (Less Or Equal) glEnable (GL_DEPTH_TEST);// Enable Depth Testing glShadeModel (GL_SMOOTH); //int abzxcvxzgfdgeragtc=5; float abcasdfsadfasfsafzcvd=5; /* HERE! MY COMP'S POSSESSED OMG */ GLfloat lightpos[] = {0,0,0}; glLightfv(GL_LIGHT0, GL_POSITION, lightpos); // set light position GLfloat lightcolor[] = {1,1,1,1}; glLightfv(GL_LIGHT0, GL_DIFFUSE, lightcolor); // set light color glEnable(GL_LIGHT0); // Enable Default Light glEnable(GL_LIGHTING); // Enable Lighting //glEnable(GL_COLOR_MATERIAL); // Enable Color Material glEnable(GL_NORMALIZE); /**/ } Yeah, defining a completely random named float value was causing the change in lighting. Deleting the line or defining it to 0 made the image look a lot darker, and defining it to anything other than 0 made the image look normal again. I'm completely oblivious to what's causing this. Does anyone have any idea to why this witchcraft is happening? I was trying out with other random names there. (variable's name didn't matter. they were all completely randomly made), and I was testing with defining with integer. (integer had no affect, 0 or 1, as it should) I tried cleaning the solution and rebuilding it several times. (the problem stayed) You probably want to see my other functions or think I'm lying. But this is really happening on my comp right now. The whole code is pretty large with several files. If anyone had similar experiences or know a solution to this, please let me know! My whole lab is curious about this. and this is part of my Display function (no /* HERE */ in here) { ... //glColor3f(0.75f,0.75f,1.0f); /**/ const GLfloat mat_ambient[] = {0.625, 0.395, 0.1, 1.0}; const GLfloat mat_diffuse[] = {0.625, 0.395, 0.1, 1.0}; const GLfloat mat_specular[] = {0.2, 0.2, 0.2, 1.0}; const GLfloat mat_shininess[] = {100.0}; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess); // Render the triangle mesh. meshRenderer->draw(); glColor3f(1.0f,0.33f,0.33f); // render control points glEnable(GL_COLOR_MATERIAL); /**/ for (unsigned int i = 0; i<controlPointPosX.size(); i++ ) { glPushMatrix(); glTranslatef(controlPointPosX+controlPointDisplacementX,controlPointPosY+controlPointDisplacementY,controlPointPosZ+controlPointDisplacementZ); myQuad=gluNewQuadric(); gluSphere( myQuad , 0.05*boundingSphere.radius , 15, 15 ); glPopMatrix(); } glDisable(GL_COLOR_MATERIAL); /**/ ... }
Advertisement
The possession is more likely to be a memory corruption:
Almost every non-postfixed openGL functions (by postfixed I mean: ..1fv,..2fv, ..3fv, ..4fv, ..1iv, ..2iv, ..3iv, ..4iv, etc) expect 4 long arrays (or pointers to 4 long arrays).
Your light position is 3 long. It has to be 4:

The last parameter should be 1, if it is a point like light source (like a light bulb, position defined by the first 3 params), and 0 if it's a directional light (parallel light rays, the direction is defined by the first 3 params).

If the last param is something else, then er... don't bother with it yet.

So I guess you want something like this

GLfloat lightpos[] = {0,0,0,0};
or
GLfloat lightpos[] = {0,0,0,1};

What do you use for learning? (book/tutorial/whatever)

I think you have to comment out the line:

glEnable(GL_COLOR_MATERIAL);

from your code because you are telling OpenGL to take the material color from the line:

glColor3f(1.0f,0.33f,0.33f);

and not from this code:

const GLfloat mat_ambient[] = {0.625, 0.395, 0.1, 1.0};
const GLfloat mat_diffuse[] = {0.625, 0.395, 0.1, 1.0};
const GLfloat mat_specular[] = {0.2, 0.2, 0.2, 1.0};
const GLfloat mat_shininess[] = {100.0};
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);

Wow szecs... That fixed it! Thank you!
You probably used the method of deduction to find the solution or used vast knowledge pool of computer programming. Either way, you are pretty amazing!

Chaging light_pos to {0,0,0,1} fixed this problem. I had no idea setting a different variable could mess up another incomplete variable like that. and I thought this had to do with GL_COLOR_MATERIAL...

To learn OpenGL, I'm using whatever I can get hands on, but mainly my book (It's a korean book because it's easier for me) and the ever famouse NeHe website. This particular code is from cg.alexandra.dk, and I was playing around with it.

and once again gamedev helps me out. hahaha I love this site.
Thank you again szecs, you ghostbuster you. and also hzcppff for trying!
Thanks for your kind words, but non of them are true!

My method: You told to skip to the commented part. I did that so I immediately spotted the light position with 3 length, that's all.
Quote:Original post by Shiine
I had no idea setting a different variable could mess up another incomplete variable like that.

Your compiler might actually rearrange the variables' positions so that your float would be placed after the lightpos array.

Thus, in memory the layout might have been: lightpos[0], lightpos[1], lightpos[2], abc... (your float variable).

Like szecs said, the light position is a 4-element array with the first 3 elements denoting the position or direction and the last element defining whether it is a point light (!= 0) or a directional light (== 0).

If your compiler places the varible after the lightpos array, the fourth element read by OpenGL would be that variable. Hence setting it to 0 would make it a directional light with a zero-length direction which would result in the wrong light intensity being calculated. Setting the variable to something else would mean the light is placed at (0,0,0) and the direction from the vertex to the light would be calculated as a vector of length one.

Hope that clarifies it a bit.
If I was helpful, feel free to rate me up ;)If I wasn't and you feel to rate me down, please let me know why!

This topic is closed to new replies.

Advertisement