2010-11-11 20 views
2

Je tente de créer un système HUD personnalisé dans DirectX 10. Ma méthode d'attaque actuelle consiste simplement à utiliser un arbre de maillages pour représenter différents niveaux du menu.DirectX 10 HUD en C++

Je crois qu'en désactivant le test de profondeur, je peux faire un maillage qui est collé au-dessus du reste de mon monde 3D en arrière-plan. Pour y parvenir, j'ai essayé d'utiliser un D3D10_DEPTH_STENCIL_DESC par lequel j'ai défini l'option DepthEnable sur false. Je lie ensuite ce D3D10_DEPTH_STENCIL_DESC à un état de stencil que j'active ensuite juste avant de dessiner mon mesh. Cela m'a laissé jusqu'à présent avec un maillage manquant.

Ma question se résume à: Suis-je sur la bonne voie avec ceci, ou ai-je besoin de repenser tout cela? De plus, si c'est un bon plan d'attaque sur ce problème, y a-t-il quelque chose que j'oublie de prendre en compte?

Voici les bits de code où je tente d'obtenir ce HUD

Création du 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)); 

Pour dessiner je simplement:

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

Répondre

1

Ouais vous aboiements le bon arbre. Il y a cependant quelque chose à garder à l'esprit: si votre système de menu est en couches, vous devez revenir en arrière car le Z-buffer ne peut pas vous aider. Cela signifiera un peu d'overdraw.

Une autre solution vous permet de limiter la surabondance en utilisant un Z-Buffer (et en particulier en utilisant le début Z rejette les supports matériels) et en dessinant d'avant en arrière. Cependant, vous avez alors le problème de l'interaction avec votre scène. Cela peut être facilement résolu en effaçant simplement le Z-Buffer avant de rendre votre menu. Bien que vous préfériez utiliser la méthode d'effacement Z-Buffer, cela signifie que vous pouvez tirer ensemble des appels beaucoup plus efficacement. C'est-à-dire que le mappage et le remplissage constants d'un ID3D10Buffer seront plus lents que de le faire une fois, puis de le redessiner en permanence. Bien sûr, lorsque l'état change, vous devrez peut-être éditer le tampon, mais vous pouvez limiter la quantité de tampon que vous éditez ET quand il n'y a pas de changement d'état, vous ne mâchez pas le processeur inutilement.