тд

bool SubScene : : isFloating ( Polygon3D * poly ) const {
if ( poly -> testFlag ( PF_PORTAL ) )
if ( ((Portal *) poly) -> getTransform () != NULL ) return true;
Plane plane ( *poly -> getPlane () ) ;
for ( Array :: Iterator it = polys. getlterator (); lit.end (); ++it )
{
Polygon3D * p = (Polygon3D *) it.value ();
if ( p -> testFlag ( PF_FLOATING ) | | p == poly ) continue;
if ( p -> classify ( plane ) == IN_BACK ) return true;
}
return false;
}

Для очистки г-буфера по видимой части портала (зеркала) удобно использовать буфер трафарета графического ускорителя - портал (зеркало) выводится с выключенной записью и в буфер кадра и в буфер глубины, но с изменением значения в буфере трафарета для тех пикселов, которые видны. В результате ни буфер глубины, пи буфер кадра не изменятся, но для всех видимых пикселов портала (зеркала) значение в буфере трафарета изменится. Тогда на следующем шаге выводится грань, спроектированная на дальнюю плоскость с выключенной проверкой глубины, включенной проверкой трафарета и включенной записью в буфер глубины (запись в буфер кадра должна быть также выключена). В результате буфер кадра вообще не изменится, а в буфер глубины будут записаны значения только для тех пикселов исходного портала, которые были бы видны при его выводе. Но записываемые значения глубины будут взяты не из исходного портала, а из проекции грани на дальнюю плоскость, т. е. фактически в них будет выведена +°° , т. е. действительно произойдет избирательная очистка буфера глубины.

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

Для реализации описанного подхода удобно создать специальньгй подкласс класса SubScene. Поскольку при рендеринге сцены нам придется часто пробегать через цепочку порталов, то в качестве операции над буфером трафарета удобно использовать увеличение и уменьшение на единицу и сравнение с заданным значением. Удобно сделать это значение static-членом класса. Подобный подход реализован в предлагаемом ниже классе, а


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