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 - без нее.

ШКХШБП 275

Рис. 10.2

ШКХШБП 275

Существует много разных способов поддержки освещенности, одним из простейших является применение так называемой закраски Гуро. При ее использовании значения освещенности явно вычисляются в вершинах граней (с использованием формулы 4.1). После чего полученные значения освещенности билинейно интерполируются вдоль всей грани для получения значений освещенности во всех остальных точках грани.


⇐ Предыдущая| |Следующая ⇒