Sign in to follow this  
Shiine

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

Recommended Posts

Shiine    100
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[i]+controlPointDisplacementX[i],controlPointPosY[i]+controlPointDisplacementY[i],controlPointPosZ[i]+controlPointDisplacementZ[i]); 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
szecs    2990
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
hzcppff    122

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
Shiine    100
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
szecs    2990
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
Lord_Evil    680
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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Similar Content

    • By Kjell Andersson
      I'm trying to get some legacy OpenGL code to run with a shader pipeline,
      The legacy code uses glVertexPointer(), glColorPointer(), glNormalPointer() and glTexCoordPointer() to supply the vertex information.
      I know that it should be using setVertexAttribPointer() etc to clearly define the layout but that is not an option right now since the legacy code can't be modified to that extent.
      I've got a version 330 vertex shader to somewhat work:
      #version 330 uniform mat4 osg_ModelViewProjectionMatrix; uniform mat4 osg_ModelViewMatrix; layout(location = 0) in vec4 Vertex; layout(location = 2) in vec4 Normal; // Velocity layout(location = 3) in vec3 TexCoord; // TODO: is this the right layout location? out VertexData { vec4 color; vec3 velocity; float size; } VertexOut; void main(void) { vec4 p0 = Vertex; vec4 p1 = Vertex + vec4(Normal.x, Normal.y, Normal.z, 0.0f); vec3 velocity = (osg_ModelViewProjectionMatrix * p1 - osg_ModelViewProjectionMatrix * p0).xyz; VertexOut.velocity = velocity; VertexOut.size = TexCoord.y; gl_Position = osg_ModelViewMatrix * Vertex; } What works is the Vertex and Normal information that the legacy C++ OpenGL code seem to provide in layout location 0 and 2. This is fine.
      What I'm not getting to work is the TexCoord information that is supplied by a glTexCoordPointer() call in C++.
      Question:
      What layout location is the old standard pipeline using for glTexCoordPointer()? Or is this undefined?
       
      Side note: I'm trying to get an OpenSceneGraph 3.4.0 particle system to use custom vertex, geometry and fragment shaders for rendering the particles.
    • By markshaw001
      Hi i am new to this forum  i wanted to ask for help from all of you i want to generate real time terrain using a 32 bit heightmap i am good at c++ and have started learning Opengl as i am very interested in making landscapes in opengl i have looked around the internet for help about this topic but i am not getting the hang of the concepts and what they are doing can some here suggests me some good resources for making terrain engine please for example like tutorials,books etc so that i can understand the whole concept of terrain generation.
       
    • By KarimIO
      Hey guys. I'm trying to get my application to work on my Nvidia GTX 970 desktop. It currently works on my Intel HD 3000 laptop, but on the desktop, every bind textures specifically from framebuffers, I get half a second of lag. This is done 4 times as I have three RGBA textures and one depth 32F buffer. I tried to use debugging software for the first time - RenderDoc only shows SwapBuffers() and no OGL calls, while Nvidia Nsight crashes upon execution, so neither are helpful. Without binding it runs regularly. This does not happen with non-framebuffer binds.
      GLFramebuffer::GLFramebuffer(FramebufferCreateInfo createInfo) { glGenFramebuffers(1, &fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); textures = new GLuint[createInfo.numColorTargets]; glGenTextures(createInfo.numColorTargets, textures); GLenum *DrawBuffers = new GLenum[createInfo.numColorTargets]; for (uint32_t i = 0; i < createInfo.numColorTargets; i++) { glBindTexture(GL_TEXTURE_2D, textures[i]); GLint internalFormat; GLenum format; TranslateFormats(createInfo.colorFormats[i], format, internalFormat); // returns GL_RGBA and GL_RGBA glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, createInfo.width, createInfo.height, 0, format, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); DrawBuffers[i] = GL_COLOR_ATTACHMENT0 + i; glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, textures[i], 0); } if (createInfo.depthFormat != FORMAT_DEPTH_NONE) { GLenum depthFormat; switch (createInfo.depthFormat) { case FORMAT_DEPTH_16: depthFormat = GL_DEPTH_COMPONENT16; break; case FORMAT_DEPTH_24: depthFormat = GL_DEPTH_COMPONENT24; break; case FORMAT_DEPTH_32: depthFormat = GL_DEPTH_COMPONENT32; break; case FORMAT_DEPTH_24_STENCIL_8: depthFormat = GL_DEPTH24_STENCIL8; break; case FORMAT_DEPTH_32_STENCIL_8: depthFormat = GL_DEPTH32F_STENCIL8; break; } glGenTextures(1, &depthrenderbuffer); glBindTexture(GL_TEXTURE_2D, depthrenderbuffer); glTexImage2D(GL_TEXTURE_2D, 0, depthFormat, createInfo.width, createInfo.height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthrenderbuffer, 0); } if (createInfo.numColorTargets > 0) glDrawBuffers(createInfo.numColorTargets, DrawBuffers); else glDrawBuffer(GL_NONE); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "Framebuffer Incomplete\n"; glBindFramebuffer(GL_FRAMEBUFFER, 0); width = createInfo.width; height = createInfo.height; } // ... // FBO Creation FramebufferCreateInfo gbufferCI; gbufferCI.colorFormats = gbufferCFs.data(); gbufferCI.depthFormat = FORMAT_DEPTH_32; gbufferCI.numColorTargets = gbufferCFs.size(); gbufferCI.width = engine.settings.resolutionX; gbufferCI.height = engine.settings.resolutionY; gbufferCI.renderPass = nullptr; gbuffer = graphicsWrapper->CreateFramebuffer(gbufferCI); // Bind glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); // Draw here... // Bind to textures glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures[0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, textures[1]); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, textures[2]); glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, depthrenderbuffer); Here is an extract of my code. I can't think of anything else to include. I've really been butting my head into a wall trying to think of a reason but I can think of none and all my research yields nothing. Thanks in advance!
    • By Adrianensis
      Hi everyone, I've shared my 2D Game Engine source code. It's the result of 4 years working on it (and I still continue improving features ) and I want to share with the community. You can see some videos on youtube and some demo gifs on my twitter account.
      This Engine has been developed as End-of-Degree Project and it is coded in Javascript, WebGL and GLSL. The engine is written from scratch.
      This is not a professional engine but it's for learning purposes, so anyone can review the code an learn basis about graphics, physics or game engine architecture. Source code on this GitHub repository.
      I'm available for a good conversation about Game Engine / Graphics Programming
    • By C0dR
      I would like to introduce the first version of my physically based camera rendering library, written in C++, called PhysiCam.
      Physicam is an open source OpenGL C++ library, which provides physically based camera rendering and parameters. It is based on OpenGL and designed to be used as either static library or dynamic library and can be integrated in existing applications.
       
      The following features are implemented:
      Physically based sensor and focal length calculation Autoexposure Manual exposure Lense distortion Bloom (influenced by ISO, Shutter Speed, Sensor type etc.) Bokeh (influenced by Aperture, Sensor type and focal length) Tonemapping  
      You can find the repository at https://github.com/0x2A/physicam
       
      I would be happy about feedback, suggestions or contributions.

  • Popular Now