const;
// set default values for drawing polygons void setDefaultStencilOpAndFunc () const;
void renderPortal ( Views view, const Cameras camera,
Polygon3D * poly, Polygon3DS tempPoly, const Frustrums viewFrustrum ) const;
} ;
Метод shouldBeSorted проверяет, должна ли данная грань быть отсортированной при помощи BSP-дерева.
Метод incToStencil осуществляет вывод данной грани только в буфер трафарета с применением операции увеличения значения буфера на единицу для видимых пикселов грани.
Метод decStencil аналогичен предыдущему методу, только он использует операцию уменьшения значения в буфере трафарета на единицу и служит для восстановления буфера трафарета после обработки портала или зеркала.
Метод setDepth служит для записи в буфер глубины значения глубины для всех пикселов данной грани, разрешенных буфером трафарета.
Метод clearDepth записывает во все пикселы данной грани, разрешенные буфером трафарета, в буфере глубины значение +«>.
Ниже приводятся реализации этих методов.
Пишем портальный рендерер (часть III)
void StencilSubScene :: setDefaultStencilOpAndFunc () const {
// enable stencil test glEnable { GL_STENCIL_TEST );
glStencilMask ( OxFF );
// we do not modify stencil when rendering // normal polys glStencilOp ( GL_KEEP, GL_KEEP, GL_KEEP ) ,-
// enable parts where stencil equals //to curStencilVal glStencilFunc ( GL_EQUAL, curStencilVal, OxFFFFFFFF );
}
void StencilSubScene :: incStencil ( const Polygon3D&
poly ) const
{
// save current state glPushAttrib ( GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT | GL_STENCIL_BUFFER_BIT ) ;
// setup OpenGL so we write only to stencil
// buffer in visible pixels of the poly
glDisable ( GL__TEXTURE_2D ) ;
glColorMask ( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
glDepthMask ( GL_FALSE );
// set op to increment on both stencil
// and z pass glStencilOp ( GL_KEEP, GL_KEEP, GL_INCR ); glStencilFunc ( GL_EQUAL, curStencilVal, OxFFFFFFFF );