II move point forward, since // due to the innacuracies of // OpenGL we sometimes get "lost" // points in fog closestPoint += DELTA * poly.getPlane () -> n;
// now draw the triangle fan on // these points curColor.w = getOpacity ( pos, closestPoint,
viewFrustrum.getNearPlane () );
glBegin ( GL_TRIANGLE_FAN );
glColor4fv ( curColor );
glVertex3fv ( closestPoint );
const Vector3D * vertices = p [i].getVertices ();
for ( int j = 0; j < p [i].getNumVertices (); j++ ) {
curColor.w = getOpacity ( pos, vertices [j],
viewFrustrum.getNearPlane () );
glColor4fv ( curColor ) ;
glVertex3fv ( vertices [j] );
}
curColor.w = getOpacity ( pos, vertices [0],
viewFrustrum.getNearPlane () );
glColor4fv ( curColor );
glVertex3fv ( vertices [0] ) ,-
glEnd () ,-
}
glPopAttrib (),-
}

Недостатком использования постоянной плотности тумана является резкий скачок плотности при переходе через плоскость, ограничивающую туман. В ряде случаев этого можно легко избежать, если использовать линейно изменяющуюся плотность, т. е. считать, что плотность тумана в точке Р задается формулой

p(P) = (P,g) + o. (12.3)

Добавляем эффекты

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

Такой туман можно представить в виде экземпляров следующего класса: о*.

class LinearFog : public Fog' {
private:
Vector3D grad;
float offs; public:
LinearFog ( const char * theName, Plane * thePlane, const Vector3D& theColor,
const Vector3D& theGrad, float theOffs ) : Fog ( theName, thePlane, theColor, l.Of )
{
grad = theGrad;
offs = theOffs;
metaClass = kclasslnstance;
}
virtual float getOpacity ( const Vector3D& from,
const Vector3D& to, Plane * clipPlane ) const;

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