Введение в программирование трехмерных игр с DX9

       

Использование буфера трафарета

Чтобы работать с буфером трафарета мы должны сперва создать его при инициализации Direct3D, а затем разрешить его использование при визуализации. Создание буфера трафарета рассматривается в разделе8.1.1. Чтобы разрешить использование буфера трафарета необходимо присвоить режиму визуализации D3DRS_STENCILENABLE значение true. Чтобы запретить использование буфера трафарета, присвойте режиму визуализации D3DRS_STENCILENABLE значение false. В приведенном ниже фрагменте кода мы сначала разрешаем использование буфера трафарета, а затем запрещаем его:

Device->SetRenderState(D3DRS_STENCILENABLE, true);

... // работа с буфером трафарета

Device->SetRenderState(D3DRS_STENCILENABLE, false);

ПРИМЕЧАНИЕ

DirectX 9.0 поддерживает двухсторонние трафареты (two-sided stencil, в этой книге они не используются), которые ускоряют визуализацию теневых объемов благодаря уменьшению количества проходов визуализации, необходимых для рисования теневого объема. Подробнее об этом говорится в документации к SDK.

Мы можем очистить буфер трафарета, заполнив его указанным значением, с помощью метода IDirect3DDevice9::Clear. Вспомните, что тот же самый метод используется для очистки вторичного буфера и буфера глубины.

Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL, 0xff000000, 1.0f, 0 );

Обратите внимание, что в третьем аргументе мы добавили флаг D3DCLEAR_STENCIL, указывающий что мы хотим очистить буфер трафарета вместе со вторичным буфером и буфером глубины. Для задания значения, которым будет заполнен буфер трафарета используется шестой аргумент; в данном примере мы заполняем буфер нулями.

ПРИМЕЧАНИЕ

Согласно презентации NVIDIA «Creating Reflections and Shadows Using Stencil Buffers» проведенной Марком Дж. Килгардом, в современных видеокартах, если вы используете буфер глубины, использование буфера трафарета можно рассматривать как «бесплатное приложение».

Содержание раздела