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