Jump to content
  • Advertisement
Sign in to follow this  
Shiine

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

This topic is 3007 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 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); /**/ ... }

Share this post


Link to post
Share on other sites
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)

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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!

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

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!