Моя земля не загорается - PullRequest
       0

Моя земля не загорается

5 голосов
/ 01 ноября 2011

Я немного застрял в своем освещении. Мой свет может освещать сетки, но он не освещает мою землю.

Вот мой код

Свет:

glEnable(GL_LIGHT0);

glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0f);
glEnable(GL_COLOR_MATERIAL);


GLfloat ambient_light0[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat position_light0[] = { 0.0f, 8.0f, 0.0f, 0.9f };


GLfloat spotDirection_light0[] = {0.0, -1.0, 0.0 };
GLfloat specularLightcolor[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv( GL_LIGHT0, GL_POSITION, position_light0 );
glLightfv( GL_LIGHT0, GL_SPOT_DIRECTION, spotDirection_light0 );
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.5);

glLightfv( GL_LIGHT0, GL_AMBIENT, ambient_light0 );
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLightcolor);

glLightf( GL_LIGHT0, GL_SPOT_CUTOFF, 60.0f );
glLightf( GL_LIGHT0, GL_SPOT_EXPONENT, 50.0f );

Земля:

void drawGround(int id) {

glEnable(GL_TEXTURE_2D);

glEnable(GL_COLOR_MATERIAL);



getTexture(id);

glBindTexture(GL_TEXTURE_2D, id); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);



GLfloat material_diffuse[] = {0.9, 0.9, 0.9, 1.0 };

    GLfloat material_specular[] = { 1, 1, 1, 1 };



glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse);

glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);


glBegin(GL_QUADS); 



for(int i = 0; i<3; i++){

    for(int j= 0; j<3; j++){

    glNormal3f(0.0f, 1.0f, 0.0f);

    glMaterialfv(GL_FRONT, GL_DIFFUSE, material_diffuse);

        glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular);

        glMaterialf(GL_FRONT, GL_SHININESS, 80.0);



    glTexCoord2f(1, 1);

    glVertex3f(-floorSize +((j)*(2*floorSize)/3), 0 ,-floorSize +((i)*(2*floorSize)/3));

    glTexCoord2f(1, 0);     

    glVertex3f(-floorSize +((j)*(2*floorSize)/3), 0 ,-floorSize +((i+1)*(2*floorSize)/3));

    glTexCoord2f(0,0);  

    glVertex3f(-floorSize +((j+1)*(2*floorSize)/3), 0 ,-floorSize +((i+1)*(2*floorSize)/3));

    glTexCoord2f(0, 1);     

    glVertex3f(-floorSize +((j+1)*(2*floorSize)/3), 0 ,-floorSize +((i)*(2*floorSize)/3));


    }

}


glDepthMask( 1.0 );

glDisable(GL_TEXTURE_2D);

glEnd();

}

Рисование земли происходит после вызова света. Кто-нибудь знает, почему моя земля не освещается?

вот скриншот моей проблемы ---> image

1 Ответ

8 голосов
/ 01 ноября 2011

Проблема в том, что заданная по умолчанию фиксированная функция освещения OpenGL выполняет подсветку только в вершинах, а затем просто интерполирует полученный цвет. Поскольку все 4 вершины земли тускло освещены, весь квадроцикл тускнеет.

Решения:

  • далее поделите землю, чтобы было больше точек отбора проб света. Пока у вас есть только 3 × 3 балла, что недостаточно. Думайте 100 × 100 или даже больше, чтобы получить хороший эффект освещения.

или

  • использовать фрагментный шейдер для реализации освещения на пиксель.

Кстати, вы столкнулись с типичной ошибкой для новичков в OpenGL.

Обновление:

Примечание: вы также не указали нормали для самолета. Поэтому освещение не будет работать вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...