glutSolidSphere не может окрасить - PullRequest
0 голосов
/ 05 мая 2019

Я возрождаю некоторые openGL / glutcode более 10 лет назад. Похоже, freeglut перешла от избытка, и что-то не совсем то же самое. Этот код используется для окраски сферы:

void DrawRider() {
    glDisable(GL_TEXTURE_2D);
    glMatrixMode(GL_MODELVIEW);
    glColor4f(1.0, 0.6, 0.4, 0.5);
    glutSolidSphere(0.5, 12, 6);
}

Теперь сфера черная, хотя она показывает некоторые признаки освещения. enter image description here

Вот код настройки:

void init (void) {
    glEnable(GL_DEPTH_TEST);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glShadeModel(GL_SMOOTH);    
    glFrontFace(GL_CCW);

    glEnable(GL_TEXTURE_2D);
    glPixelStorei(GL_UNPACK_ALIGNMENT,1);

    if (transparent) glEnable(GL_BLEND);

    glColor3f(1.0,1.0,1.0);

    gCameraReset();

    glPolygonOffset (1.0, 1.0);
    SetLighting(4);
    glEnable(GL_LIGHTING);
}

void SetLighting(unsigned int mode)
{
    GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
    GLfloat mat_shininess[] = {90.0};

    GLfloat position[4] = {7.0,-7.0,12.0,0.0};
    GLfloat ambient[4]  = {0.2,0.2,0.2,1.0};
    GLfloat diffuse[4]  = {1.0,1.0,1.0,1.0};
    GLfloat specular[4] = {1.0,1.0,1.0,1.0};

    glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
    glMaterialfv (GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);

    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);

    switch (mode) {
    // OTHER CASES ELIDED FOR POSTING TO StackOverflow
        case 4:
            glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
            glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);
            break;
    }

    glLightfv(GL_LIGHT0,GL_POSITION,position);
    glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);
    glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse);
    glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
    glEnable(GL_LIGHT0);
}

А вот код дисплея, который вызывает DrawRider:

void maindisplay(void)
{
    if (textured) glEnable(GL_TEXTURE_2D);
    else glDisable(GL_TEXTURE_2D);

    if (transparent) glDepthMask(0);
    else glDepthMask(1);

    if (!riding) {
        // track ball rotation
        glRotatef (gTrackBallRotation[0], gTrackBallRotation[1], gTrackBallRotation[2], gTrackBallRotation[3]);
        glRotatef (gWorldRotation[0], gWorldRotation[1], gWorldRotation[2], gWorldRotation[3]);
    }

    glClearColor (0.2f, 0.2f, 0.2f, 1.0f);  // defines the "background" color
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    // clear the surface

    if (!riding) DrawRider();   

    glutSwapBuffers();
}

1 Ответ

0 голосов
/ 10 июня 2019

Включение возможности на стороне клиента (glEnableClientState) конфликтует с glutSolidSphere. Если клиентское состояние GL_COLOR_ARRAY включено, цвет пытается считываться из массива фиксированных атрибутов, который устанавливается glColorPointer вместо использования текущего цвета, который был установлен glColor.
Нет веских причин для включения возможности на стороне клиента. Вам это понадобится, только если вы нарисуете свою собственную геометрию, например, по glDrawArrays.

Снимите флажок, разрешив клиенту разрешить проблему:

void init (void) {
    glEnable(GL_DEPTH_TEST);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    //glEnableClientState(GL_COLOR_ARRAY);  <---- delete
    //glEnableClientState(GL_VERTEX_ARRAY);

    // ...
}

Обратите внимание, что неясно, что происходит, если включена функция на стороне клиента и вызывается glutSolidSphere. Вероятно, это зависит от библиотеки переизбытка (freeglut, glut) и ее версии.

...