Transparent gaps between triangles on Windows 7?!

Started by
6 comments, last by MarkS 13 years, 10 months ago
Hi Guys,

I just ported some OpenGL rendering code that worked fine running on Windows XP/Visual Studio 2005 to Windows 7/Visual Studio Express 2010. The port was generally smoother than I had even hoped...it ran almost immediately with just some minor tweaking.

However, I noticed one really strange issue; there is a small transparent gap at the edges of all my triangles. It looks to be just a single or few pixels wide, but it is affecting every triangle I render. I had never seen this on XP and non of my OpenGL config has changed.

I admittedly haven't dug deep searching for the cause yet in code, but I'm hoping someone here has a quick and dirty answer?

Thanks!
Advertisement
Quote:Original post by Grumple
Hi Guys,

I just ported some OpenGL rendering code that worked fine running on Windows XP/Visual Studio 2005 to Windows 7/Visual Studio Express 2010. The port was generally smoother than I had even hoped...it ran almost immediately with just some minor tweaking.

However, I noticed one really strange issue; there is a small transparent gap at the edges of all my triangles. It looks to be just a single or few pixels wide, but it is affecting every triangle I render. I had never seen this on XP and non of my OpenGL config has changed.

I admittedly haven't dug deep searching for the cause yet in code, but I'm hoping someone here has a quick and dirty answer?

Thanks!


Hello,
do you have some screenshot?

Regards,
WS

Sorry I don't have a screen-shot readily available, as this is an old OpenGL engine I am converting in pieces, and haven't hooked that functionality up.

I did more testing last night, and came across the apparent cause...although I have no idea why. It seems that enabling anti-aliasing is the cause of my problem?!

Specifically I am using polygon smoothing via:
glEnable(GL_POLYGON_SMOOTH);
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);

When I enable this I always see gaps between my triangles. Disabling it everything works fine. I am particularly surprised as this functionality always worked perfectly on my x86 WinXP development machine.

I even double checked to make sure vertex coords of adjacent/connected triangles are identical (they are).

I can try to get my screen shot functionality up and running, but the issue is easy enough to visualize. If I render a 'sphere' of triangles without anti-aliasing it shows up solid against a colored background. If I enable polygon smooth, I can see 'lines' along all triangle edges of the sphere of the same color as the background (back face culling is enabled). I even see this effect rendering two triangles directly facing the camera (one diagonal see-through line where they connect). The gap only ever seems to be 1 pixel wide.

Any thoughts? For now I can just disable anti-aliasing but I'd like to at least understand what is going on...

Thanks!
Are your graphics drivers upto date?
When I was checking some code of an API using OpenGL (I don't remember which one right now), I found that antialiasing was enabled through an extension, not through GL_POLYGON_SMOOTH. Also it was enabled in a completely different way, by specifying the degree of antialiasing expected.

I think you're dealing with something that has nothing to do with the antialiasing hardware used for standard stuff, but more like "antialias sides regardless of other primitives". It happened to work elsewhere because of broken drivers (most likely a misunderstanding), probably.
Don't pay much attention to "the hedgehog" in my nick, it's just because "Sik" was already taken =/ By the way, Sik is pronounced like seek, not like sick.
Hey Guys,

Thanks for the quick replies. My graphics drivers are definitely up to date, Uni.
I think your suggestion was dead on though, Sik. Once I knew it was my smoothing causing the problem I did some googling, and found others encountering this issue. My fix was to change my smoothing implementation as follows:

Change this:

if(FLO_ENABLE_ANTI_ALIASING == TRUE)
{
glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glEnable(GL_POLYGON_SMOOTH);
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
}

To

if(FLO_ENABLE_ANTI_ALIASING == TRUE)
{
glEnable(GL_MULTISAMPLE_ARB);
}

Everything seems to be working fine now. I am just confused as to why it used to work fine the old way on an 8800 GTS but failed on a new GTX470..

Thanks for the help!
Quote:Original post by Grumple
Everything seems to be working fine now. I am just confused as to why it used to work fine the old way on an 8800 GTS but failed on a new GTX470..

nVidia probably wanted to save hardware resources (or development budget =P) and reused the framebuffer antialiasing hardware, since in the end the outcome is similar to what the user would want.

Quote:Original post by Grumple
Thanks for the help!

You're welcome! =)
Don't pay much attention to "the hedgehog" in my nick, it's just because "Sik" was already taken =/ By the way, Sik is pronounced like seek, not like sick.
Quote:Original post by Grumple
Everything seems to be working fine now. I am just confused as to why it used to work fine the old way on an 8800 GTS but failed on a new GTX470..


This is an known issue with GL_POLYGON_SMOOTH. I ran into this issue on a 7950GT several years ago when I wrote a wide line function that rendered anti-aliased polygons. The only solution was to set the edge flags so that only the exterior edges were anti-aliased. However, this is rather difficult with a closed object. Heck, it was difficult to do with a wide line.

It is worth mentioning that this is a depreciated feature.

No, I am not a professional programmer. I'm just a hobbyist having fun...

This topic is closed to new replies.

Advertisement