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



         

Код и комментарии



8.3.5. Код и комментарии

В этом разделе мы исследуем код, взятый из примера Shadow, находящегося в сопроводительных файлах к этой книге. Код, который важен для данного примера, находится в функции RenderShadow. Обратите внимание, что мы подразумеваем, что буфер трафарета уже очищен и заполнен нулями.

Мы начинаем с установки относящихся к работе трафарета режимов визуализации. Мы устанавливаем функцию сравнения D3DCMP_EQUAL, а режим визуализации D3DRS_STENCILREF равным 0x0, в результате чего пиксели тени будут визуализироваться во вторичный буфер если значение соответствующего элемента буфера трафарета равно 0x0.

Поскольку буфер трафарета очищен и заполнен нулями (0x0), при первой записи пикселя тени проверка будет всегда звершаться успешно; но поскольку мы присвоили режиму D3DRS_STENCILPASS значение D3DSTENCILOP_INCR, если мы еще раз попытаемся записать пиксель в то же самое место, проверка трафарета не будет пройдена. Когда мы записываем самый первый пиксель тени, соответствующее ему значение в буфере трафарета увеличивается и страновится равным 0x1, после этого при любой другой попытке записать пиксель в то же самое место проверка трафарета не будет пройдена. Так мы праедотвращаем перезапись пикселей и двойное смешивание.

void RenderShadow() { Device->SetRenderState(D3DRS_STENCILENABLE, true); Device->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL); Device->SetRenderState(D3DRS_STENCILREF, 0x0); Device->SetRenderState(D3DRS_STENCILMASK, 0xffffffff); Device->SetRenderState(D3DRS_STENCILWRITEMASK, 0xffffffff); Device->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); Device->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); Device->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_INCR);

Затем мы вычисляем матрицу преобразования тени и перемещаем тень в требуемое место сцены.

// Вычисление преобразования проекции чайника // в тень D3DXVECTOR4 lightDirection(0.707f, -0.707f, 0.707f, 0.0f); D3DXPLANE groundPlane(0.0f, -1.0f, 0.0f, 0.0f);




Содержание  Назад  Вперед