SDL / вопрос комплектации OpenGL - PullRequest
1 голос
/ 27 июня 2011

Привет, это может показаться сложным вопросом (или, по крайней мере, для меня это так), но я использую glUnproject, и он не работает.Когда я использую ту же функцию с OpenGL и Winapi, она работала как чудо, но теперь не работает при использовании OpenGl и SDL, предполагается, что это то же самое, но кажется, что это не так ... да, мне действительно нужна помощь в этом, вот моя функциядля выбора

void Game::Picking(int x,int y,int Which)
{

    GLint viewport[4];
    GLfloat depth[2];
    GLubyte pixel[3];
    GLdouble modelview[16];
    GLdouble projection[16];
    GLfloat winX, winY;
    GLdouble posX, posY, posZ,oldPosZ;
    oldPosZ = posZ;

    glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
    glGetDoublev( GL_PROJECTION_MATRIX, projection );
    glGetIntegerv( GL_VIEWPORT, viewport );

    winX = (float)x;
    winY = (float)viewport[3] - (float)y;
    glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, depth );//geting depth

    glReadPixels(x, int(winY),1,1,GL_RGB,GL_UNSIGNED_BYTE,(void *)pixel);//getting Pixels
    printf("Color1 %x Color2 %p Color3 %d ",pixel[0],pixel[1],pixel[2]);
    if(Which == 0)
    {
        if(pixel[0] == MP_SinglePlayer.x && pixel[1] == MP_SinglePlayer.y && pixel[2] == MP_SinglePlayer.z)
        {
        printf("Detected Click Single Player");
            b_MenuPrincipal = false;
            b_JuegoSolo = true;
        }
        else if(pixel[0] == MP_MultiPlayer.x && pixel[1] == MP_MultiPlayer.y && pixel[2] == MP_MultiPlayer.z)
        {
        printf("Detected Click MultiPlayer");
            b_MenuPrincipal = false;
            b_MenuSrvClt = true;
        }
        else if(pixel [0] == MP_Exit.x && pixel [1] == MP_Exit.y && pixel [2] == MP_Exit.z)
        {
        printf("Detected Click Salir");
            b_MenuPrincipal = false;
            b_Exit = true;
        }
    }
}

это, как предполагается, возвращает мне цвета, где я выбрал, но когда я открываю stderr, это дает мне

mouseX 430, mouseY 295

Color1 0 Color2 00000000 Color3 0 mouseX 430, mouseY 295

Color1 0 Color2 00000000 Color3 0 mouseX 430, mouseY 295

и я печатаю с x, p, d, потому что я просто хотел увидеть различияно ничего из этого не работает, и вот мой основной цикл игры (надеюсь, это не сложно понять)

 while(Exit == 0)
  {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity(); 

    glTranslatef(-PosicionCam[0].x,-PosicionCam[0].y,-PosicionCam[0].z);
    Uint32 inicio = SDL_GetTicks();
    float delta = ((float)inicio - (float)ultimo) * 0.001f;
    SDL_PumpEvents();


    keyboardstate = SDL_GetKeyState(NULL);

    if(keyboardstate [SDLK_ESCAPE]) salir = 1;


    if(b_MenuPrincipal){
        if(SDL_GetMouseState(&mousex, &mousey) & SDL_BUTTON(1))
        {
        printf("mouseX %d , mouseY %d \n",mousex,mousey);
        Picking(mousex,mousey,0);
        }
        menup->Move(PosicionCam[0].x,PosicionCam[0].y,PosicionCam[0].z);
        menup->Draw();
    }

SDL_GL_SwapBuffers();

если у вас есть какие-либо вопросы по этому поводу, пожалуйста, скажите мне, что я постараюсь ответить сразунадеюсь, что вы можете помочь мне tyvm

1 Ответ

3 голосов
/ 27 июня 2011

Во-первых, выбор должен быть сделан после рисования, возможно, на SDL ваш буфер рендеринга очищен.

Во-вторых, самое главное, я не заметил код, который использует glReadPixels (..., GL_DEPTH_COMPONENT, .., deep) или gluUnProject. Ваш вопрос о выборе цвета или не проектировании в конце концов? Это выглядит как сумасшедшая смесь обоих. Вы читаете глубину, игнорируете ее, затем читаете значение RGB и рассматриваете его как координаты XYZ.

Вы должны читать глубину и отменять проекцию с помощью gluUnProject. Тогда, если вам нужно - прочитайте цветные пиксели с помощью glReadPixels (..., GL_RGB, ...) и используйте его как-нибудь.

...