OpenGL2, свет проходит сквозь непрозрачный объект, не работают блики

Свет от направленных прожекторов проходит сквозь поверхность стола и оказывается на полу под ним, а также на обратной поверхности столешницы. введите сюда описание изображения

    GLfloat light[]={1.0, 1.0, 1.0, 1.0};
    GLfloat light0[]={0.0, 0.0, 0.0, 0.0};
    glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE , light);
    glMaterialfv(GL_FRONT, GL_SPECULAR, light);
    glMaterialf(GL_FRONT, GL_SHININESS, 128);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, table.GetTexture());
    glBegin(GL_QUADS);
    glNormal3f( 0.0f, 1.0f, 0.0f);//верх столешницы
    RectSurface(....); //разбиение поверхности на прямоугольники (использую glTexCoord2f и glVertex3f) 

    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, light0);
    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0);

    glNormal3f( 0.0f,-1.0f, 0.0f);//низ столешницы
    RectSurface(....);

Перед рисованием всех плоскостей выставляю нормали (для пола glNormal3f(0.0f, 1.0f, 0.0f)). Свет ламп имеет следующие параметры (одинаковые):

GLfloat light_position[]={0.55f*roomWidth, 0.85f*wallHeight, 0.08f*roomLength, 1};
GLfloat dir[]={0, -0.5f*wallHeight, 0, 0};
GLfloat light[]={1, 1, 1, 1};
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, light);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);
glLightfv(GL_LIGHT0, GL_SPECULAR, light);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 128);
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 60);
glEnable(GL_LIGHT0);

Для текстур использую glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE). Кроме того не получаются блики на поверхности стола (и вообще ни на каких поверхностях). С чем это может быть связано?


Ответы (1 шт):

Автор решения: Kromster

Всё просто - в OpenGL (как впрочем и в других рендерах) нету теней "из коробки". Расчет освещения пола не знает ни о каком столе над собой. Чтобы добавить тени, часто используют Shadow Mapping или Stencil Shadows.

→ Ссылка