Sign in to follow this  
Sime

OpenGL Blending and lines, code behaves differently depending on PC

Recommended Posts

I'm currently writing a Simulator for a project im working at. I used to work with a buddy that handled the OpenGL part of it, but now he's gone so I inherited that aswell. I had to add a small piece of code for drawing lines (path taken by a vehicle), but while on some PCs it works fine (nice RED color), on my laptop and some other PCs it doesn't work, and the color is different, and seems actually blended (if i turn off the critical area display the line's color changes.). I've tried messing around with the position of my own code, but result doesn't change. I'm puzzled because it looks fine on some PCs and in some it looks odd :( I've tried to cut the unimportant code off and just posted the part that's releted to rendering
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);				// Black Background
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glClearDepth(1.0f);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

        // Zoom handling
	glTranslatef(Vista.x0 * Vista.Scale * (1.0f/ScaleIniziale), Vista.yy0 * Vista.Scale * (1.0f/ScaleIniziale), Vista.z0-5.0f);
	glScalef(Vista.Scale,Vista.Scale,Vista.Scale);

        // Lights
	glCallList(ListeLuci.Lights);

	glPushMatrix();
                // Draw stuff like the texture background
		glEnable(GL_DEPTH_TEST);		
		glDisable(GL_BLEND);
		
		glTranslatef(0.0f, 0.0f, 0.0f);
		glCallList(Liste.Map);
		glTranslatef(0.0f, 0.0f, 0.01f);
		glTranslatef(0.0f, 0.0f, -0.009f);


                // Draw transparent stuff (like critical area highlight)		
		glEnable(GL_BLEND);			
		glDisable(GL_DEPTH_TEST);	
		glTranslatef(0.0f, 0.0f, 0.001f);
		if (m_view_critical == TRUE) glCallList(Liste.CriticalArea);
		glTranslatef(0.0f, 0.0f, 0.001f);
		if (m_view_FOVs == TRUE) DrawFOA();
		glTranslatef(0.0f, 0.0f, 0.001f);
		DrawVehicles(GL_RENDER);
		glTranslatef(0.0f, 0.0f,  0.005f);
		DrawTracks(GL_RENDER);
	glPopMatrix();
	glFlush();

        // Draw non-transparent lines representing a graph
	glColor3ub(255,0,0);
	for(it = graph.begin(); it != graph.end(); it++)
	{
		// [...]
                // Compute stuff
		for(itedge = edges.begin(); itedge != edges.end(); itedge++)
		{
			glLineWidth (1);
			glBegin(GL_LINES);
				glVertex3f(FROM.x,FROM.y,0.0f);
				glVertex3f(TO.x,TO.y,0.0f);
			glEnd();

		}
	}

Thanks for any help

Share this post


Link to post
Share on other sites
// Draw transparent stuff (like critical area highlight)
glEnable(GL_BLEND);

The glDisable(GL_BLEND) call is missing here.
Add that after the glFlush() call and see what happens. ;)

Edit: Ah, and you should put your glLineWidth() / glBegin(GL_LINES) / glEnd() calls outside the loop (at least the inner one).

Share this post


Link to post
Share on other sites
Quote:
Original post by Lord_Evil
// Draw transparent stuff (like critical area highlight)
glEnable(GL_BLEND);

The glDisable(GL_BLEND) call is missing here.
Add that after the glFlush() call and see what happens. ;)

Where exactly the glDisable call is missing? I've tried adding it before drawing my lines but the effect doesn't change. Also tried adding it just before the glPopMatrix() but still the same :/

Quote:

Edit: Ah, and you should put your glLineWidth() / glBegin(GL_LINES) / glEnd() calls outside the loop (at least the inner one).


Agreed. Ty for tip

Share this post


Link to post
Share on other sites
You should add it after the glFlush() call. Also reenable depth testing (glEnable(GL_DEPTH_TEST); ).

Assuming the functions you didn't post (like DrawTracks() ) don't change the OpenGL state the relevant part could look like:

...
glPopMatrix();
glFlush();

glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
...


Another source for the problem could be anti-aliasing/super sampling. Does your application turn that on on specific machines? Or do the machines force OpenGL to perform anti-aliasing (look at the OpenGL display settings)?

Share this post


Link to post
Share on other sites
Quote:
Original post by Lord_Evil
You should add it after the glFlush() call. Also reenable depth testing (glEnable(GL_DEPTH_TEST); ).


It was one of the first thing I thought of, but it didn't work.

Quote:

Assuming the functions you didn't post (like DrawTracks() ) don't change the OpenGL state


They don't

Quote:

Another source for the problem could be anti-aliasing/super sampling. Does your application turn that on on specific machines? Or do the machines force OpenGL to perform anti-aliasing (look at the OpenGL display settings)?


Neither of them

Share this post


Link to post
Share on other sites
Quote:
Original post by jezham
Possibly you still have textures enabled before drawing the lines.


Think I fell in love with you :D

Adding glEnable(GL_TEXTURE_2D); after the glPushMatrix() and glDisable(GL_TEXTURE_2D); just before the popMatrix() fixed the problem on my laptop.

Still doesn't explain why it worked on the other PCs, tho i guess it's due to different implementations of OpenGL in the drivers

Thanks!

Share this post


Link to post
Share on other sites
Quote:
Original post by Sime
Think I fell in love with you :D

Adding glEnable(GL_TEXTURE_2D); after the glPushMatrix() and glDisable(GL_TEXTURE_2D); just before the popMatrix() fixed the problem on my laptop.

Still doesn't explain why it worked on the other PCs, tho i guess it's due to different implementations of OpenGL in the drivers

Thanks!


Feeling the love :)

I guess the other PCs had anti aliasing or anisotropic filtering. Your (textured) line had no tex-coords supplied, and the filters were mixing colours from around the lower-left (plus wrapping) of the previous bound texture.

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