2010-11-11 3 views
2

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

Я считаю, что, отключив тест глубины, я могу сделать сетку, которая вставлена ​​над остальной частью моего 3D-мира в фоновом режиме. Для этого я попытался использовать 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

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

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

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

Смежные вопросы