Blending and lines, code behaves differently depending on PC

Started by
8 comments, last by Sime 15 years, 8 months ago
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
Advertisement
// 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).
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!
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
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)?
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!
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
Possibly you still have textures enabled before drawing the lines.
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!
No need for glFlush
http://www.opengl.org/wiki/index.php/Common_Mistakes#glFinish_and_glFlush
Sig: http://glhlib.sourceforge.net
an open source GLU replacement library. Much more modern than GLU.
float matrix[16], inverse_matrix[16];
glhLoadIdentityf2(matrix);
glhTranslatef2(matrix, 0.0, 0.0, 5.0);
glhRotateAboutXf2(matrix, angleInRadians);
glhScalef2(matrix, 1.0, 1.0, -1.0);
glhQuickInvertMatrixf2(matrix, inverse_matrix);
glUniformMatrix4fv(uniformLocation1, 1, FALSE, matrix);
glUniformMatrix4fv(uniformLocation2, 1, FALSE, inverse_matrix);
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.
Thanks for all the tips :)

This topic is closed to new replies.

Advertisement