2015-07-13 1 views
0

Je suis des tutoriels en ligne pour m'aider à créer mon premier jeu, et jusqu'à présent, je comprends tous les concepts que Direct3D 11 doit lancer moi.J'ai besoin de quelques éclaircissements sur le concept de tampons profondeur/stencil dans direct3D 11 (C++)

Mais il y a un certain concept que je ne peux pas encore saisir complètement; les tampons profondeur/stencil. Je comprends que des tampons profondeur/stencil sont utilisés pour "comparer" les profondeurs des pixels d'objets différents dans un jeu. Si deux objets se chevauchent, l'objet qui a moins de profondeur dans les pixels apparaîtra plus près de la caméra. Et vous définissez un tampon profondeur/pochoir en remplissant le D3D11_TEXTURE2D_DESC ..

Mais ma question est; si je remplis la structure D3D11_TEXTURE2D_DESC, puis-je dire directX COMMENT pour comparer les pixels d'objets différents dans un jeu?

Si vous ne comprenez pas ma question, s'il vous plaît essayez d'expliquer le concept de profondeur/stencil tampons aussi simple que possible. Également s'il vous plaît essayez d'expliquer ce que je suis en train de définir en remplissant la structure D3D11_TEXTURE2D_DESC

Merci.

+0

De la documentation, il ressemble à 'D3D11_TEXTURE2D_DESC' est utilisé pour décrire le contenu et la disposition de la texture. Comme cela indique à Direct3D comment lire la texture. La largeur, la hauteur, les canaux de couleur, combien de bits par canal de couleur, et l'ordre dans lequel ils se trouvent (RGBA, BGRA, RGB non A, BGR non A, stocké dans float? Peut-être unsigned int?etc) – Alex

+0

J'apprends OpenGL moi-même en ce moment, donc je peux me tromper. Mais ce que je comprends est que le tampon de profondeur aide à déterminer quel pixel sera montré dans l'image finale. Si vous avez des polygones qui se chevauchent, et que l'un derrière est dessiné en premier, alors quand les autres polygones dessinent, sa valeur de profondeur sera comparée à la valeur de profondeur du polygone précédent. Si c'est sur le dessus alors ce pixel est écrit dans le tampon de couleur. Sinon le résultat est simplement annulé – Alex

+0

Donc non, si vous remplissez la structure de description, vous dites à Direct3D comment lire et stocker le résultat (Combien de bits, quel type de données). Maintenant, comment le comparer. Je ne sais pas quel est l'équivalent pour D3D, mais en OpenGL, il y a 'glDepthFunc()' qui peut changer la façon dont OpenGL compare les valeurs de profondeur. Vous pouvez le définir sur GL_LESS, GL_GREATER etc. Voici la documentation de MS sur les tampons Depth-Stencil. Il semble qu'ils utilisent un enum: 'D3D11_COMPARISON_FUNC': https://msdn.microsoft.com/en-us/library/windows/desktop/bb205074%28v=vs.85%29.aspx Je pense que cela pourrait être l'équivalent de' glDepthFunc() ' – Alex

Répondre

0

Lorsque vous remplissez D3D11_TEXTURE2D_DESC, vous décrivez le tampon profondeur/stencil lui-même: quelle est sa taille, quel format utilise-t-il, comment vous voulez le lier au pipeline.

La construction « passe-partout » pour cela est la suivante (prise de Direct3D Win32 Game Visual Studio template en utilisant le C++ équivalent CD3D11_TEXTURE2D_DESC

CD3D11_TEXTURE2D_DESC depthStencilDesc(depthBufferFormat, 
    backBufferWidth, backBufferHeight, 1, 1, 
    D3D11_BIND_DEPTH_STENCIL); 

ComPtr<ID3D11Texture2D> depthStencil; 
DX::ThrowIfFailed(
    m_d3dDevice->CreateTexture2D(&depthStencilDesc, nullptr, 
     depthStencil.GetAddressOf())); 

Le depthBufferFormat est déterminée par le niveau de précision que vous voulez, si vous ou non utilisez un tampon stencil et votre Direct3D Feature Level Le modèle utilise par défaut DXGI_FORMAT_D24_UNORM_S8_UINT qui fonctionne sur toutes les feuilles de fonction et fournit une précision raisonnable pour la profondeur et un pochoir 8 bits.La taille doit correspondre exactement à votre tampon arrière couleur

Vous liez le tampon de profondeur-stencil au pipeline de rendu en créant une «vue» pour le tampon.

CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc(D3D11_DSV_DIMENSION_TEXTURE2D); 
DX::ThrowIfFailed(
    m_d3dDevice->CreateDepthStencilView(depthStencil.Get(), 
     &depthStencilViewDesc, m_depthStencilView.ReleaseAndGetAddressOf())); 

Vous avez alors « claire » la vue chaque image, puis associez la vue pour le rendu:

m_d3dContext->ClearDepthStencilView(m_depthStencilView.Get(), 
    D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0); 

m_d3dContext->OMSetRenderTargets(1, m_renderTargetView.GetAddressOf(), 
    m_depthStencilView.Get()); 

vous dire Direct3D comment à faire la comparaison avec D3D11_DEPTH_STENCIL_DESC (ou équivalent C++ D3D11_DEPTH_STENCIL_DESC) .

L'état de profondeur 'par défaut'/pochoir est:

DepthEnable = TRUE; 
DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; 
DepthFunc = D3D11_COMPARISON_LESS; 
StencilEnable = FALSE; 
StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK; 
StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK; 

const D3D11_DEPTH_STENCILOP_DESC defaultStencilOp = 
    { D3D11_STENCIL_OP_KEEP, 
     D3D11_STENCIL_OP_KEEP, 
     D3D11_STENCIL_OP_KEEP, 
     D3D11_COMPARISON_ALWAYS }; 

FrontFace = defaultStencilOp; 
BackFace = defaultStencilOp; 

Dans le DirectX Tool Kit, nous fournissons trois états de profondeur communs:

// DepthNone 
CD3D11_DEPTH_STENCIL_DESC desc(default); 
desc.DepthEnable = FALSE; 
desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; 
desc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL; 

// DepthDefault 
CD3D11_DEPTH_STENCIL_DESC desc(default); 
desc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL; 

// DepthRead 
CD3D11_DEPTH_STENCIL_DESC desc(default); 
desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; 
desc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL;