OpenGL - изменить свет 3D-сферы с помощью всплывающего меню - PullRequest
0 голосов
/ 03 мая 2020

Я обновил после предложения в разделах комментариев. Это должно быть лучше и работает нормально сейчас. Тем не менее, не стесняйтесь комментировать и обсуждать! Я действительно хочу sh улучшить свое программирование в OpenGL!


Я новичок в OpenGL. Я хочу создать всплывающее меню для изменения освещения (рассеянное, рассеянное, зеркальное и положение) сферы. Тем не менее, есть некоторые проблемы с отображением света. Он работает соответственно, нажимая на выбор, например, ambient -> diffuse -> specular), но не может работать, когда (specular -> diffuse).

Вот часть моего кода.

void display(void)
{
    GLfloat gray[] = { 0.8, 0.8, 0.8, 1.0 };
    GLfloat cyan[] = { 0.0, 1.0, 1.0, 0.0 };
    GLfloat black[] = { 0.0, 0.0, 0.0, 1.0 };
    GLfloat white[] = { 0.8f, 0.8f, 0.8f, 1.0f };

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glTranslatef(0.0, 0.0, tdist);
    glRotatef((GLfloat)spinx, 1.0, 0.0, 0.0);
    glRotatef((GLfloat)spiny, 0.0, 1.0, 0.0);
    glRotatef((GLfloat)spinz, 0.0, 0.0, 1.0);

    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, gray);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, cyan);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white);
    glMaterialfv(GL_FRONT_AND_BACK, GL_POSITION, cyan);
    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50);

    glEnable(GL_LIGHTING);
    glEnable(GL_POLYGON_OFFSET_FILL);

    if (value == 2) {
        glEnable(GL_LIGHT0);
        glPolygonOffset(polyfactor, polyunits);
        glCallList(list);
    }
    else if (value == 3) {
        glEnable(GL_LIGHT1);
        glPolygonOffset(polyfactor, polyunits);
        glCallList(list);
    }
    else if (value == 4) {
        glEnable(GL_LIGHT2);
        glPolygonOffset(polyfactor, polyunits);
        glCallList(list);
    }
    else if (value == 5) {
        glEnable(GL_LIGHT3);
        glPolygonOffset(polyfactor, polyunits);
        glCallList(list);
    }

    glDisable(GL_POLYGON_OFFSET_FILL);
    glDisable(GL_LIGHTING);
    glDisable(GL_LIGHT0);
    glDisable(GL_LIGHT1);
    glDisable(GL_LIGHT2);
    glDisable(GL_LIGHT3);

    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    glCallList(list);
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    glPopMatrix();
    glFlush();
}

Большое спасибо, если кто-нибудь может помочь !!!

...