Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8015377
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 4, 20262026-06-04T20:14:29+00:00 2026-06-04T20:14:29+00:00

What is the best method to select objects that have been drawn in OpenGL

  • 0

What is the best method to select objects that have been drawn in OpenGL ES 2.0 (iOS)?

I am drawing points.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-04T20:14:30+00:00Added an answer on June 4, 2026 at 8:14 pm

    Here is working prototype of color picking, tested on most old ipads and working well. This is actually some part of project called InCube Chess that one may find in app store. The main code you will see is located in a class derived from GLKViewController like this:

    @interface IncubeViewController : GLKViewController
    

    This means you have glkview in it: ((GLKView *)self.view).

    Here are also some properties:

    @property (strong, nonatomic) EAGLContext *context;
    @property (strong, nonatomic) GLKBaseEffect *effect;
    

    Don’t forget to synthesize them in your *.m file.

    @synthesize context = _context;
    @synthesize effect = _effect;
    

    The idea is that you have chess pieces on your table (or some objects in your 3d scene) and you need to find a piece in your list of pieces by tapping on a screen. That is, you need to convert your 2d screen tap coords (@point in this case) to chess piece instance.

    Each piece has its unique id that I call a “seal”. You can allocate the seals from from 1 up to something. Selection function returns piece seal found by tap coords. Then having the seal you can easily find your piece in pieces hash table or array in a way like this:

    -(Piece *)findPieceBySeal:(GLuint)seal
    {
            /* !!! Black background in off screen buffer produces 0 seals. This allows
               to quickly filter out taps that did not select anything (will be
               mentioned below) !!! */
            if (seal == 0)
                    return nil;
            PieceSeal *sealKey = [[PieceSeal alloc] init:s];
            Piece *p = [sealhash objectForKey:sealKey];
            [sealKey release];
            return p;
    }
    

    “sealhash” is a NSMutableDictionary.

    Now this is the main selection function. Note, that my glkview is antialised and you can’t use its buffers for color picking. This mean you need to create your own off screen buffer with antialiasing disabled for picking purposes only.

    - (NSUInteger)findSealByPoint:(CGPoint)point
    {
            NSInteger height = ((GLKView *)self.view).drawableHeight;
            NSInteger width = ((GLKView *)self.view).drawableWidth;
            Byte pixelColor[4] = {0,};
            GLuint colorRenderbuffer;
            GLuint framebuffer;
    
            glGenFramebuffers(1, &framebuffer);
            glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
            glGenRenderbuffers(1, &colorRenderbuffer);
            glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
    
            glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, width, height);
            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER, colorRenderbuffer);
    
            GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
            if (status != GL_FRAMEBUFFER_COMPLETE) {
                    NSLog(@"Framebuffer status: %x", (int)status);
                    return 0;
            }
    
            [self render:DM_SELECT];
    
            CGFloat scale = UIScreen.mainScreen.scale;
            glReadPixels(point.x * scale, (height - (point.y * scale)), 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixelColor);
    
            glDeleteRenderbuffers(1, &colorRenderbuffer);
            glDeleteFramebuffers(1, &framebuffer);
    
            return pixelColor[0];
    }
    

    Note that function takes into account display scale (retina or new iPads).

    Here is render() function used in function above. Note, that for rendering purposes it clear s the buffer with some background color and for selecting case it makes it black so that you can easily check if you tapped on any piece at all or not.

    - (void) render:(DrawMode)mode
    {
            if (mode == DM_RENDER)
                    glClearColor(backgroundColor.r, backgroundColor.g,
                                 backgroundColor.b, 1.0f);
            else
                    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
            /* Draw all pieces. */
            for (int i = 0; i < [model->pieces count]; i++) {
                    Piece *p = [model->pieces objectAtIndex:i];
                    [self drawPiece:p mode:mode];
            }
    }
    

    Next is how we draw the piece.

    - (void) drawPiece:(Piece *)p mode:(DrawMode)mode
    {
            PieceType type;
    
            [self pushMatrix];
    
            GLKMatrix4 modelViewMatrix = self.effect.transform.modelviewMatrix;
    
            GLKMatrix4 translateMatrix = GLKMatrix4MakeTranslation(p->drawPos.X,
                                                                   p->drawPos.Y,
                                                                   p->drawPos.Z);
            modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, translateMatrix);
    
            GLKMatrix4 rotateMatrix;
            GLKMatrix4 scaleMatrix;
    
            if (mode == DM_RENDER) {
                    scaleMatrix = GLKMatrix4MakeScale(p->scale.X,
                                                      p->scale.Y, p->scale.Z);
            } else {
                    /* !!! Make the piece a bit bigger in off screen buffer for selection
                       purposes so that we always sure that we tapped it correctly by
                       finger.*/
                    scaleMatrix = GLKMatrix4MakeScale(p->scale.X + 0.2,
                                                      p->scale.Y + 0.2, p->scale.Z + 0.2);
            }
    
            modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, scaleMatrix);
    
            self.effect.transform.modelviewMatrix = modelViewMatrix;
    
            type = p->type;
    
            if (mode == DM_RENDER) {
                    /* !!! Use real pieces color and light on for normal drawing !!! */
                    GLKVector4 color[pcLast] = {
                            [pcWhite] = whitesColor,
                            [pcBlack] = blacksColor
                    };
                    self.effect.constantColor = color[p->color];
                    self.effect.light0.enabled = GL_TRUE;
            } else {
                    /* !!! Use piece seal for color. Important to turn light off !!! */
                    self.effect.light0.enabled = GL_FALSE;
                    self.effect.constantColor = GLKVector4Make(p->seal / 255.0f,
                                                               0.0f, 0.0f, 0.0f);
            }
    
            /* Actually normal render the piece using it geometry buffers. */
            [self renderPiece:type];
    
            [self popMatrix];
    }
    

    This is how to use the functions shown above.

    - (IBAction) tapGesture:(id)sender
    {
            if ([(UITapGestureRecognizer *)sender state] == UIGestureRecognizerStateEnded) {
                    CGPoint tap = [(UITapGestureRecognizer *)sender locationInView:self.view];
                    Piece *p = [self findPieceBySeal:[self findSealByPoint:tap]];
    
                    /* !!! Do something with your selected object !!! */
            }
    }
    

    This is basically it. You will have very precise picking algorithm that is much better than ray tracing or others.

    Here helpers for push/pop matrix things.

    - (void)pushMatrix
    {
            assert(matrixSP < sizeof(matrixStack) / sizeof(GLKMatrix4));
            matrixStack[matrixSP++] = self.effect.transform.modelviewMatrix;
    }
    
    - (void)popMatrix
    {
            assert(matrixSP > 0);
            self.effect.transform.modelviewMatrix = matrixStack[--matrixSP];
    }
    

    Here also glkview setup/cleanup functions that I used.

    - (void)viewDidLoad
    {
            [super viewDidLoad];
            self.context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2] autorelease];
            if (!self.context)
                    NSLog(@"Failed to create ES context");
    
            GLKView *view = (GLKView *)self.view;
            view.context = self.context;
            view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
    
            [self setupGL];
    }
    
    - (void)viewDidUnload
    {    
            [super viewDidUnload];
    
            [self tearDownGL];
    
            if ([EAGLContext currentContext] == self.context)
                    [EAGLContext setCurrentContext:nil];
            self.context = nil;
    }
    
    - (void)setupGL
    {
            [EAGLContext setCurrentContext:self.context];
    
            self.effect = [[[GLKBaseEffect alloc] init] autorelease];
            if (self.effect) {
                    self.effect.useConstantColor = GL_TRUE;
                    self.effect.colorMaterialEnabled = GL_TRUE;
                    self.effect.light0.enabled = GL_TRUE;
                    self.effect.light0.diffuseColor = GLKVector4Make(1.0f, 1.0f, 1.0f, 1.0f);
            }
    
            /* !!! Draw antialiased geometry !!! */
            ((GLKView *)self.view).drawableMultisample = GLKViewDrawableMultisample4X;
            self.pauseOnWillResignActive = YES;
            self.resumeOnDidBecomeActive = YES;
            self.preferredFramesPerSecond = 30;
    
            glDisable(GL_DITHER);
            glEnable(GL_CULL_FACE);
            glEnable(GL_DEPTH_TEST);
            glLineWidth(2.0f);
    
            /* Load pieces geometry */
            [self loadGeometry];
    }
    
    - (void)tearDownGL
    {
            drawReady = NO;
            [EAGLContext setCurrentContext:self.context];
            [self unloadGeometry];
    }
    

    Hope this helps and may be closes “the picking question” forever 🙂

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

What is the best method of doing the following: I have Page A with
Best method to add/remove webcontrols or user controls in asp.net for dynamic forms without
Which is the best method.To open an link using button <button type=button onclick=location='permalink.php'>Permalink</button> <button
What is best method to implement ReST based Web Services in Java. Should I
What is the best method of using native menus in C#? Edit: I want
What is the best method [pattern] to close a newly opened Windows form in
What's the best method for looping through a table, grabbing all the data in
What is the best method, if there is one, of using Wordpress as a
What is the best method to strip html tags from the input? How can
What is the best method to include shipping quotes in my cart? The basic

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.