DirectX 10 HUD в C ++ - PullRequest
       7

DirectX 10 HUD в C ++

2 голосов
/ 11 ноября 2010

Я пытаюсь создать собственную систему HUD в DirectX 10. Мой текущий метод атаки - просто использовать дерево ячеек для представления различных уровней меню.

Я полагаю, что, отключив Тест глубины, я могу создать меш, который будет вставлен над остальной частью моего трехмерного мира на заднем плане. Чтобы добиться этого, я попытался использовать D3D10_DEPTH_STENCIL_DESC, в результате чего я установил для параметра DepthEnable значение false. Затем я связываю этот D3D10_DEPTH_STENCIL_DESC с состоянием трафарета, который затем активирую перед тем, как нарисовать свою сетку. Это до сих пор оставило меня с отсутствующей сеткой.

Мой вопрос действительно сводится к следующему: нахожусь ли я на правильном пути с этим, или мне нужно переосмыслить это вообще? Кроме того, если это хороший план атаки на эту проблему, есть ли что-то, что я забыл принять во внимание?

Ниже приведены фрагменты кода, где я пытаюсь получить этот HUD

Создание D3D10_DEPTH_STENCIL_DESC:

    //HUD Elements
D3D10_DEPTH_STENCIL_DESC dsDesc;
//Depth Settings 
dsDesc.DepthEnable      = false;
dsDesc.DepthWriteMask   = D3D10_DEPTH_WRITE_MASK_ALL;
dsDesc.DepthFunc        = D3D10_COMPARISON_LESS;
//Stencil settings
dsDesc.StencilEnable    = true;
dsDesc.StencilReadMask  = 0xff;
dsDesc.StencilWriteMask = 0xff;
//Always pass the stencil test, and replace the current stencil value with 
// the stencil reference value 1
dsDesc.FrontFace.StencilFailOp      = D3D10_STENCIL_OP_KEEP;
dsDesc.FrontFace.StencilDepthFailOp = D3D10_STENCIL_OP_KEEP;
dsDesc.FrontFace.StencilPassOp      = D3D10_STENCIL_OP_REPLACE;
dsDesc.FrontFace.StencilFunc        = D3D10_COMPARISON_ALWAYS;
// We are not rendering backfacing polygons, so these settings do not matter.
dsDesc.BackFace.StencilFailOp       = D3D10_STENCIL_OP_KEEP;
dsDesc.BackFace.StencilDepthFailOp  = D3D10_STENCIL_OP_KEEP;
dsDesc.BackFace.StencilPassOp       = D3D10_STENCIL_OP_REPLACE;
dsDesc.BackFace.StencilFunc         = D3D10_COMPARISON_ALWAYS;
//Bind HUD to a stencil
HR(md3dDevice->CreateDepthStencilState(&dsDesc,&hud));

Рисовать я просто делаю:

    md3dDevice->OMSetDepthStencilState(hud, 1);
menu.draw(mVP);

1 Ответ

1 голос
/ 11 ноября 2010

Да, ты лаешь на правильное дерево. Однако следует иметь в виду, что если ваша система меню имеет многоуровневую структуру, то вам НЕОБХОДИМО откатиться назад, поскольку Z-буфер не может вам помочь. Это будет означать довольно много оверрейдов.

Другое решение позволяет ограничить объем перерасхода с помощью Z-буфера (и особенно с помощью раннего Z, отклоняющего аппаратную поддержку) и рисования спереди назад. Однако тогда у вас возникает проблема взаимодействия с вашей сценой. Это можно легко исправить, просто очистив Z-Buffer перед рендерингом вашего меню.

TBH, хотя вам лучше использовать метод очистки Z-буфера, поскольку это означает, что вы можете объединять вызовы друг с другом намного эффективнее. т.е. постоянное отображение и заполнение буфера ID3D10 будет медленнее, чем один раз, а затем постоянно перерисовывать его. Конечно, при изменении состояния вам может понадобиться отредактировать буфер, но вы можете ограничить объем редактируемого буфера, а когда нет изменений состояния, вы не прожираете процессор без необходимости.

...