Для определения прозрачности грани добавим метод isTransparent в классы Texture и PoIygon3D. Простейший вариант этого метода для класса Texture выглядит следующим образом: га

bool isTransparent () const {
return format.bitsPerPixel == 8 || format. bitsPerPixel == 32,-
}

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

Метод isTransparent для грани должен проверить не только прозрачность текстуры, но и цвет как в каждой из вершин, так и глобальный цвет для всей грани.

ашхтт

Пишем портальный рендерер (часть II)

bool Polygon3D :: isTransparent () const {
if ( texture != NULL && texture -> isTransparent () ) return true;
if ( colors != NULL )
for ( int i = 0; i < numVertices; i++ ) if ( colors [i].w < l.Of - EPS ) return true;
return color.w < l.Of - EPS;
}

Простейшим способом упорядочения граней является их сортировка (например, по расстоянию от середины грани до наблюдателя вдоль направления вектора взгляда), однако в определенных случаях этот метод может давать неправильные результаты. Здесь мы будем использовать BSP-деревья (см. гл. 2) для упорядочения полупрозрачных граней (и только их). В случае если ориентация и расположение полупрозрачных граней не меняются в процессе просмотра сцены, то использование BSP-деревьев оказывается очень удобным. И даже в тех случаях, когда происходит изменение положения (или ориентации) полупрозрачных граней, поскольку их обычно немного, BSP-дерево по ним может быть быстро перестроено. Из-за небольшого числа полупрозрачных граней (а BSP-дерево строится только по ним) сильного разбиения граней не происходит и сама операция построения дерева занимает лишь незначительное время.

Узел BSP-дерева может быть представлен в виде следующего класса: Е

class BspNode : public Plane {
public:
Polygon3D * facet;
BspNode * front; // subtree in positive halfspace

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