Двухсторонняя набор элементов (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
См. также