Sign in to follow this  
Sime

OpenGL Blending and lines, code behaves differently depending on PC

Recommended Posts

Sime    122
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
Lord_Evil    680
// 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
Sime    122
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
Lord_Evil    680
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
Sime    122
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
Sime    122
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
jezham    204
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  

  • Similar Content

    • By povilaslt2
      Hello. I'm Programmer who is in search of 2D game project who preferably uses OpenGL and C++. You can see my projects in GitHub. Project genre doesn't matter (except MMO's :D).
    • By ZeldaFan555
      Hello, My name is Matt. I am a programmer. I mostly use Java, but can use C++ and various other languages. I'm looking for someone to partner up with for random projects, preferably using OpenGL, though I'd be open to just about anything. If you're interested you can contact me on Skype or on here, thank you!
      Skype: Mangodoor408
    • By tyhender
      Hello, my name is Mark. I'm hobby programmer. 
      So recently,I thought that it's good idea to find people to create a full 3D engine. I'm looking for people experienced in scripting 3D shaders and implementing physics into engine(game)(we are going to use the React physics engine). 
      And,ye,no money =D I'm just looking for hobbyists that will be proud of their work. If engine(or game) will have financial succes,well,then maybe =D
      Sorry for late replies.
      I mostly give more information when people PM me,but this post is REALLY short,even for me =D
      So here's few more points:
      Engine will use openGL and SDL for graphics. It will use React3D physics library for physics simulation. Engine(most probably,atleast for the first part) won't have graphical fron-end,it will be a framework . I think final engine should be enough to set up an FPS in a couple of minutes. A bit about my self:
      I've been programming for 7 years total. I learned very slowly it as "secondary interesting thing" for like 3 years, but then began to script more seriously.  My primary language is C++,which we are going to use for the engine. Yes,I did 3D graphics with physics simulation before. No, my portfolio isn't very impressive. I'm working on that No,I wasn't employed officially. If anybody need to know more PM me. 
       
    • By Zaphyk
      I am developing my engine using the OpenGL 3.3 compatibility profile. It runs as expected on my NVIDIA card and on my Intel Card however when I tried it on an AMD setup it ran 3 times worse than on the other setups. Could this be a AMD driver thing or is this probably a problem with my OGL code? Could a different code standard create such bad performance?
    • 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.
  • Popular Now