Ray ray ( org, vertices [i] - org ) ;
v = ray.point ( ray.intersect ( farPlane ) );
glVertex3fv ( v );
}
glEnd ();
// restore attributes glPopAttrib ();
}
void StencilSubScene :: setDepth ( const Polygon3D&
poly ) const
{
// save current state glPushAttrib ( GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT | GL_STENCIL_BUFFER_BIT );
// now reset depth to max where stencil is
// equal to curStencilVal by projecting
// verices onto the far plane leaving
// stencil unchanged
glDepthMask ( GL_TRUE );
glColorMask ( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
glEnable ( GL_STENCIL_TEST );
glStencilFunc ( GL_EQUAL, curStencilVal, OxFFFFFFFF );
glStencilOp ( GL_KEEP, GL_KEEP, GL_KEEP );
glDepthFunc ( GL_ALWAYS );
II now draw the polygon to depth buffer // leaving stencil intact drawPolygon ( poly );
// restore attributes glPopAttrib ();
}
Для задания преобразования в портале добавим новую команду в описание портала - transform. Простейший вид этой команды приводится ниже.
transform translate (х, у, z)
Эта команда задает портал с перемещением на вектор (д:, у, z). Для задания зеркала удобно добавить новый стиль грани - зеркало.
style mirror
Определенные изменения необходимо внести и в модуль обработки столкновений для осуществления перехода при пересечении портала с преобразованием.
РАБОТА С КАРТАМИ ОСВЕЩЕННОСТИ
Одним из весьма существенных недостатков рендерера, построенног в предыдущих главах, является отсутствие какой-либо поддержки освещег ности. Все грани считаются одинаково освещенными.
Однако в реальном мире всегда присутствуют источники освещена приводящие к неравномерному освещению граней сцены. Так, на рис. 10. приведена сцена с наличием освещенности, а на рис. 10.2 - без нее.
Рис. 10.2
ШКХШБП 275
Существует много разных способов поддержки освещенности, одним из простейших является применение так называемой закраски Гуро. При ее использовании значения освещенности явно вычисляются в вершинах граней (с использованием формулы 4.1). После чего полученные значения освещенности билинейно интерполируются вдоль всей грани для получения значений освещенности во всех остальных точках грани.