Класс Shader представляет собой коллекцию объектов типа ShaderPass, которые по очереди применяются к выводимому объекту.

class Shader : public Object {
protected:
Array passes;
public:
Shader ( const char * theName ) : Object ( theName ) {
metaClass = kclasslnstance;
}

Добавляем модели

void addPass ( ShaderPass * pass ) passes. insert ( pass ) ,-
void removePass ( const Strings theName ) passes.removeObjectWithName ( theName );
ShaderPass * getPass ( const Strings theName )
return (ShaderPass *) passes.getObjectWithName
( theName );
void drawPoly ( Views view, const Polygon3D * poly ) const ,-
void drawMesh ( Views view, const Cameras camera, const Vector4D& color. Fog * fog, const Mesh3D * mesh ) const;
static MetaClass classlnstance;
};

Класс Shader осуществляет полное восстановление состояния OpenGL, используя вызовы функций glPushAttrib и glPopAttrib.

5?
void Shader :: drawMesh ( Views view,
const Cameras camera, const Vector4D& color, Fog * fog,
const Mesh3D * mesh ) const
{
// save OpenGL state glPushAttrib ( GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT | GL_LIGHTING_BIT | GL_TEXTURE_BIT );
// perform passes for ( Array :: Iterator it = passes.getlterator (); ! it.end (); ++it )
{
ShaderPass * pass = (ShaderPass *) it.value (); pass -> drawMesh ( view, camera, color, fog, mesh );
}
II restore OpenGL state glPopAttrib ();
}

Для поддержки шейдеров введем в класс MeshObject ссылку на используемый шейдер (лучше включить эту ссылку именно в класс MeshObjecl, а не в класс Mesh3D, поскольку разные экземпляры класса Mesh3D могут иметь разные шейдеры) и добавим в метод doDraw вызов соответствующего шейдера.

'ГЦ

ОМ.

void MeshObject : -. doDraw ( Views view, const Cameras
camera, const Frustrums frustrum, Fog * fog )
{
if ( shader == NULL )
mesh -> draw ( view, camera, color, fog ) ,-else
shader -> drawMesh ( view, camera, color, fog, mesh );
}

Примеры сцен, использующих шейдеры, можно найти на компакт-диске.


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