Jump to content
  • Advertisement
Sign in to follow this  
clayrab

OpenGL Picking works fine on OSX but not in Windows. SelectBuffer is full of garbage.

This topic is 2582 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I've been developing a game in OSX since last April and the time has come to try to compile it on Windows. Everything works perfectly except for picking and I can't understand why the same code would work one way on windows and another way on OSX... The issue is that sometimes on Windows the picking buffer has 5 names in it... I'm not sure if one of these might actually be the proper name, but regardless, I only give one name to any object so this shouldn't be possible.

So, I'm quite lost and am hoping that maybe someone has a clue that could point me in the right direction.

I'm using gcc(with mingw on windows) and opengl 2.1. Although, I'm actually dynamically linking against opengl32.dll on Windows, I have confirmed that I'm getting a 2.1 context.

Additionally, I *believe* this was working a while ago and have since then added display lists to my code... It's going to be a bit of a pain, but I'm going to rip out that code for now to see if that might be causing an issue since they were deprecated in 3.1... I don't *think* it's the issue but will know shortly and will report back here.

Share this post


Link to post
Share on other sites
Advertisement
"Picking" is a fairly general idea with endless ways it can be implemented. What kind of implementation are you using?

Share this post


Link to post
Share on other sites
Hodgman, I'm using gluPickMatrix/glSelectBuffer... Not sure if that answers your question.

I actually call gluPickMatrix twice, once for the UI and once for the game board. I'm in GL_SELECT render mode, of course.

Edit: it's basically copied from NeHe

Share this post


Link to post
Share on other sites
I have some more details so I figure I might as well add them...

The game is also crashing on Windows... Occasionally the VM it's running in crashes as well and twice now my entire system crashed...

I was somehow able to get some info from it before my system went down last time though. It was finding 0 or 1 names for a while(which is expected) but then suddenly it found 80 on one frame and then 18 million + on the next! Since I only allocated 512 bytes for the buffer of names, I'm guessing the gl is writing millions of bytes across my memory and this is why everything is crashing...

Edit:
Additionally, removing ALL of the picking code(everything after glRenderMode(GL_SELECT) and before glRenderMode(GL_RENDER)) stabilizes it.

Share this post


Link to post
Share on other sites
Okay, so in hope of finding a clue I printf'ed the entire buffer and found some very strange behaviour. Each byte is seperated by a colon. This is what 'one hit' looks like on OSX

1:-2823681:-2823681:96:1:-2823681:-2823681:123:0:-2823681:-2823681:201:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:

This looks perfectly normal. There are two extra hits, but those are simply leftover from another frame, the buffer isn't zeroed out every frame, that would be a waste.

In Windows, however, the buffer looks like this:

[font="monospace"]12:12:0:0:0:0:0:4:0:0:0:0:0:0:0:0:0:4:0:251658240:0:-2127593169:637567279:-2051201536:0:0:0:0:1065353216:-998637568:1148846080:0:0:515:0:1155930377:0:0:6408:0:9728:83886080:66336:0:0:65536:66817:0:0:65536:0:0:0:1158479872:0:0:0:0:0:0:335616264:0:1154637824:0:52430080:838860801:0:0:0:338694144:0:0:0:0:335616264:0:0:0:0:0:0:335616264:0:1158537216:0:0:0:0:335616264:0:336887808:0:0:0:0:335616264:0:0:0:0:0:0:335616264:0:1144410112:0:0:0:0:335616264:0:337448960:0:0:0:0:335616264:0:0:0:0:0:0:335616264:0:1142222848:0:0:0:0:335616264:0:332238848:0:0:0:0:335616264:0:0:0:0:0:0:335616264:0:0:0:0:0:0:335616264:0:0:0:0:0:0:335616264:0:104978368:0:0:0:0:335616264:0:9:0:2:1280:800:1:0:4:0:0:0:0:4:0:80:13:1:0:4259840:4:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:18:0:0:2:5120:4:1280:800:1:80:13:1:0:4:0:0:1280:800:1:10:9:0:0:0:0:0:0:0:0:0:0:0:0:0:785907712:0:0:0:0:0:-1091632638:0:1280:800:1:10:9:0:0:12:12:1:0:4:0:0:0:0:0:0:0:0:0:0:0:4:0:0:0:0:0:0:0:4259840:0:0:0:0:1073743168:0:712057992:1359073280:3145728:-2147482368:66336:50331648:0:155794:81:15728640:0:0:0:0:0:0:0:0:0:0:0:0:0:0:16:0:4259840:0:105055264:0:4:0:0:0:0:0:0:0:213:513:2:2:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:4259840:0:0:4259840:0:0:0:0:45519708:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:12:45514250:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:262144:[/font]
[font="monospace"]

Complete garbage.

Anyway, I found the problem halfway through writing this post but figured I'd include all this anyway in case it helps someone else. The problem was actually quite simple.

RTFM!!!!!

"glSelectBuffer[font="Times"] must be issued before selection mode is enabled, and it must not be issued while the rendering mode is [/font]GL_SELECT[font="Times"]."[/font]

[font="Times"]So, if you have a bunch of garbage in your select buffer, you probably called [/font]glSelectBuffer while in GL_SELECT render mode.

[/font]

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!