Параметры теста буфера трафарета DirectX9

У меня есть функция, которая отображает треугольник нужного цвета. Я пытаюсь отобразить желтый треугольник, а затем красный треугольник над ним с включенным тестом трафарета. Я использую круг в качестве окна трафарета. Какими должны быть мои тестовые уравнения и операции трафарета, чтобы получить результат ниже. Весь рендеринг только в DirectX09. Желаемый результат Просьба привести несколько хороших и простых примеров для следующих API....

SetRenderState(D3DRS_STENCILFUNC,
SetRenderState(D3DRS_STENCILREF,
SetRenderState(D3DRS_STENCILMASK,
SetRenderState(D3DRS_STENCILWRITEMASK,
SetRenderState(D3DRS_STENCILZFAIL,
SetRenderState(D3DRS_STENCILFAIL,
SetRenderState(D3DRS_STENCILPASS,

Как мы используем операцию Stencil в файле эффектов шейдеров DirectX09 (vsSetRenderState(D3DRS_STENCILMASK,0 и psSetRenderState(D3DRS_STENCILMASK,0)?


person control    schedule 07.01.2013    source источник


Ответы (1)


документация RenderStates должен ответить на большинство ваших связанных вопросов.

Для создания трафаретной маски вам понадобятся методы

SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP)
SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_INCRSAT)
SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_INCRSAT)
SetRenderState(D3DRS_STENCILFUNC,D3DCMP_ALWAYS)

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

SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP)
SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_KEEP)
SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_KEEP)
SetRenderState(D3DRS_STENCILFUNC,D3DCMP_LESS)    
SetRenderState(D3DRS_STENCILREF,0)

так что ваш трафарет возвращает только истину, где ваш круг был нарисован ранее (должно быть значение трафарета больше 0). Если после этого ничего не рисуется должным образом, попробуйте деактивировать Z-Test, возможно, порядок ваших треугольников неправильный.

Как мы используем операцию Stencil в файле эффектов шейдеров DirectX09 (vs_3_0 и ps_3_0)?

Операции с трафаретом используются только из основного программного кода. Шейдеры никак не влияют на трафаретные тесты.

person Gnietschow    schedule 12.01.2013
comment
SetRenderState(D3DRS_STENCILFUNC,D3DCMP_LESS) вместо SetRenderState(D3DRS_STENCILFUNC,D3DCMP_GREATER) сработал для меня. Z-тест не имеет никакого значения, так как весь рендеринг выполняется на одной z-плоскости. - person control; 12.01.2013
comment
Я изменил свой ответ, но он должен быть как минимум МЕНЬШЕ, потому что значение не может быть меньше нуля. Не знаю, почему это работает, странно;) - person Gnietschow; 12.01.2013