Поделиться через


Двухсторонняя набор элементов (Direct3D 9)

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

Первая отрисовка рисует многоугольники вперед и увеличивает значения элементов-буфера. Вторая отрисовка рисует многоугольники задней области теневого тома и уменьшает значения буфера элементов. Как правило, все добавочные и отложенные значения отменяют друг друга. Однако сцена уже была отрисовывается с нормальной геометрией, что приводит к сбою теста z-буфера при отрисовки теневого тома. Значения, оставшиеся в буфере элементов, соответствуют пикселям, которые находятся в тени. Эти оставшиеся содержимое буфера трафаретов используются в качестве маски, чтобы альфа-смешивать большой, все охватывающий черный квадрат в сцену. При использовании буфера набора элементов, выступающего в качестве маски, результатом является темный пиксель, который находится в тени.

Это означает, что теневая геометрия рисуется дважды на источник света, поэтому давление на вершинную пропускную способность GPU. Двухсторонняя функция набора элементов разработана для устранения этой ситуации. В этом подходе существует два набора состояния наборов элементов (с именем ниже), один набор для треугольников с передней стороны и другой для треугольников с задней стороны. Таким образом, только один проход рисуется на теневой том на свет.

Изменения API ограничены новым набором состояний отрисовки. Новое состояние отрисовки D3DRS_Two_Sided_StencilMODE может иметь значение TRUE или FALSE. Значение FALSE по умолчанию означает текущее поведение (DirectX 8). Если задано значение TRUE (оно будет работать только в том случае, если задано D3DSTENCILCAPS_TWOSIDED), следующие состояния отрисовки будут применяться только к треугольникам передней (по часовой стрелке).

Состояние отрисовки Description
D3DRS_STENCILFAIL D3DSTENCILOP делать, если тест набора элементов завершается ошибкой.
D3DRS_STENCILZFAIL D3DSTENCILOP делать, если тест наборов проходит и z-тест завершается ошибкой.
D3DRS_STENCILPASS D3DSTENCILOP делать, если передаются наборы элементов и z-тесты.
D3DRS_STENCILFUNC D3DCMPFUNC fn. Тест набора элементов проходит, если ((ref & mask) stencilfn (набор элементов и маска)) имеет значение true.

 

Новый набор состояний отрисовки применяется к треугольникам с задней стороны (контрблокировкой).

Состояние отрисовки Description
D3DRS_CCW_STENCILFAIL D3DSTENCILOP делать, если тест набора элементов завершается ошибкой.
D3DRS_CCW_STENCILZFAIL D3DSTENCILOP делать, если тест наборов проходит и z-тест завершается ошибкой.
D3DRS_CCW_STENCILPASS D3DSTENCILOP делать, если передаются наборы элементов и z-тесты.
D3DRS_CCW_STENCILFUNC функция D3DCMPFUNC. Тест набора элементов проходит, если ((ref & mask) stencilfn (набор элементов и маска)) имеет значение true.

 

Остальные состояния отрисовки элементов всегда применяются как к по часовой стрелке, так и к треугольникам со счетчиком.

D3DRS_Two_Sided_StencilMODE игнорируется для строк и спрайтов точек, что означает, что поведение не изменяется из DirectX 8. Состояния отрисовки D3DRS_CCW_STENCIL* игнорируются.

Новый бит крышки указывает, поддерживает ли устройство эту функцию. Драйверы, которые не поддерживают эту функцию, должны игнорировать эти новые состояния отрисовки. Все остальные биты наборов элементов применяются к обоим режимам буферизации элементов. Так как Two_Sided_Stencil подразумевает возможность рисования с D3DCULLMODE_NONE набором, соответствующая крышка должна быть задана драйвером, если она поддерживает этот новый режим набора элементов. Microsoft Windows Hardware Quality Labs (WHQL) должен применить это.

Новые состояния отрисовки:

D3DRS_Two_Sided_StencilMODE // BOOL (default is FALSE)
D3DRS_CCW_STENCILFAIL     // Same default as D3DRS_STENCILFAIL
D3DRS_CCW_STENCILZFAIL    // Same default as D3DRS_STENCILZFAIL
D3DRS_CCW_STENCILPASS     // Same default as D3DRS_STENCILPASS
D3DRS_CCW_STENCILFUNC     // Same default as D3DRS_STENCILFUNC

Новая крышка:

D3DSTENCILCAPS_TWOSIDED // a flag on D3DCAPS9.StencilCaps

Методы буфера наборов элементов

D3DRENDERSTATETYPE