работа с openGL - PullRequest
       4

работа с openGL

2 голосов
/ 09 марта 2012

Я пытаюсь сделать небольшую трехмерную сцену с openGL и включить немного освещения, я в порядке с моей сценой (хотя это не является чем-то особенным) и я пытаюсь добавить немного освещения, чтобы придать ей некоторый эффект. однако я могу добавить материал к своему подиуму (который не текстурирован), и это дает мне свет, и все, что является текстурированным, не применяет к нему никакого материала, поэтому оно не поддается освещению. Вот часть кода.

// Setup GL_LIGHT0
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);     // Setup ambient light
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);     // Setup diffuse light
glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);   // Setup specular light

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, ca);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, la);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, qa);

glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 180.0f);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 0.0);

// Setup GL_LIGHT1
glLightfv(GL_LIGHT1, GL_AMBIENT, lightAmbient);     // Setup ambient light
glLightfv(GL_LIGHT1, GL_DIFFUSE, lightDiffuse);     // Setup diffuse light
glLightfv(GL_LIGHT1, GL_SPECULAR, lightSpecular);   // Setup specular light

glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, ca);
glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, la);
glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, qa);

glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 180.0f);
glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 0.0);
// Setup GL_LIGHT2
glLightfv(GL_LIGHT2, GL_AMBIENT, lightAmbient);     // Setup ambient light
glLightfv(GL_LIGHT2, GL_DIFFUSE, lightDiffuse);     // Setup diffuse light
glLightfv(GL_LIGHT2, GL_SPECULAR, lightSpecular);   // Setup specular light

glLightf(GL_LIGHT2, GL_CONSTANT_ATTENUATION, ca);
glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, la);
glLightf(GL_LIGHT2, GL_QUADRATIC_ATTENUATION, qa);

glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 180.0f);
glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 0.0);
// Setup GL_LIGHT3
glLightfv(GL_LIGHT3, GL_AMBIENT, lightAmbient);     // Setup ambient light
glLightfv(GL_LIGHT3, GL_DIFFUSE, lightDiffuse);     // Setup diffuse light
glLightfv(GL_LIGHT3, GL_SPECULAR, lightSpecular);   // Setup specular light

glLightf(GL_LIGHT3, GL_CONSTANT_ATTENUATION, ca);
glLightf(GL_LIGHT3, GL_LINEAR_ATTENUATION, la);
glLightf(GL_LIGHT3, GL_QUADRATIC_ATTENUATION, qa);

glLightf(GL_LIGHT3, GL_SPOT_CUTOFF, 180.0f);
glLightf(GL_LIGHT3, GL_SPOT_EXPONENT, 0.0);

// OpenGL provides a global ambient light component - we don't want this so set to zero
GLfloat global_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);

И для рендеринга моей комнаты + 3d объект.

glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHT1);
    glEnable(GL_LIGHT2);
    glEnable(GL_LIGHT3);

    // Define position and direction
    // NOTE: Placing these commands AFTER the above viewing (camera) transformations means the light position and direction appear to have a set point / direction in the 3D environment.  If these commands are placed BEFORE the above viewing transformations, then the light appears to move with the camera (as if it is attached to the camera!)
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDirection);
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

    glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, lightDirection1);
    glLightfv(GL_LIGHT1, GL_POSITION, lightPosition1);

    glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, lightDirection2);
    glLightfv(GL_LIGHT2, GL_POSITION, lightPosition2);

    glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, lightDirection3);
    glLightfv(GL_LIGHT3, GL_POSITION, lightPosition3);


    // setup materials for objects to draw
    glMaterialfv(GL_FRONT, GL_AMBIENT, ambientMaterial);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial);
    glMaterialfv(GL_FRONT, GL_SPECULAR, specularMaterial);


    // 2. Draw scene
    glPushMatrix();
        drawRoom();
        glTranslatef(0.0,-0.75,0.0);
        glRotatef(90.0, 1.0,0.0, 0.0);
        glRotatef(-spin, 0.0,0.0, 1.0);
        glColor3f(1.0, 1.0, 1.0);
        drawPodium();
    glPopMatrix();

    // Save transformations prior to rendering scene
    glPushMatrix();

        glColor3f(0.0, 0.0, 1.0);   

        // Setup texture state
        glEnable(GL_TEXTURE_2D);
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

        glRotatef(spin, 0.0,1.0, 0.0);
        // Render model

        glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial2);

        glTranslatef(0.0,0.8,0.0);
        glRotatef(1.0,1.0,0.0,0.0);
        myModel->renderTexturedModel();

        // Reset texture state
        glDisable(GL_TEXTURE_2D);

    // restore transformations after rendering scene
    glPopMatrix();

А текущий результат с моими четырьмя огнями, в квадратной форме над вертолетом, все смотрят вниз в сторону 0.0:

My scene

Если вы можете разглядеть белые пунктирные линии, они показывают направление света. поверхность подиума освещена, и стороны подиума освещены, поскольку это вращается. Однако остальная часть комнаты и вертолет не реагируют на свет и действуют так, как будто освещение даже не включено, поэтому я думаю, что это потому, что все, кроме подиума, текстурировано.

Ответы [ 2 ]

6 голосов
/ 09 марта 2012

Вам нужно настроить glTexEnv, чтобы указать, как освещение должно работать для текстурированных объектов

См:

21.030 Почему не работает освещение при включении наложения текстур? http://www.opengl.org/resources/faq/technical/texture.htm

Или для более непосредственного решения вашей проблемы, строка

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

это то, что вызывает поведение. Как объясняет faq, когда вы задаете GL_REPLACE, вы заменяете примитивный цвет освещения на цвет текстуры, который перезаписывает любые расчеты освещения. Вы можете полностью удалить эту строку, так как GL_MODULATE является поведением по умолчанию.

0 голосов
/ 24 января 2014

Я не знаю, работает ли вышеуказанный метод для вас.У меня такая же проблема.Моя проблема заключалась в том, что я не указывал нормали объекта.

// указываем нормали glNormal3f ();

, надеюсь, это решит проблему для всех (я пробовал любой другой метод поверхИнтернет, но ничего не работает, только этот метод работал).

...