Intro :
Il est nécessaire de manipuler une bonne dizaine d’objets ou d’interfaces pour initialiser DirectX 11 avant de commencer tout affichage 3D.
Prérequis :
– Avoir déjà lu le code pour initialiser DirectX 10 ou 11
Explications :
Les-voici énumérés ci-dessous.
/* Objets nécessaires pour afficher du rendu 3D à l'écran */ IDXGISwapChain* m_pSwapChain = nullptr; ID3D11Device* m_pDevice = nullptr; ID3D11DeviceContext* m_pDeviceContext = nullptr; ID3D11RenderTargetView* m_pRenderTargetView = nullptr; ID3D11Texture2D* m_pDepthStencilBuffer = nullptr; ID3D11DepthStencilState* m_pDepthStencilState = nullptr; ID3D11DepthStencilView* m_pDepthStencilView = nullptr; ID3D11RasterizerState* m_pRasterState = nullptr; /* Objets pour effectuer des requêtes à la carte graphique */ IDXGIFactory* pDXGIFactory = nullptr; IDXGIAdapter* pDXGIAdapter = nullptr; IDXGIOutput* pDXGIAdapterOutput = nullptr; ID3D11Texture2D* pBackBuffer = nullptr; /* Objets de description de données pour les objets nécessaires au rendu */ DXGI_SWAP_CHAIN_DESC swapChainDesc; D3D11_TEXTURE2D_DESC depthBufferDesc; D3D11_DEPTH_STENCIL_DESC depthStencilDesc; D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc; D3D11_RASTERIZER_DESC rasterDesc; DXGI_ADAPTER_DESC adapterDesc; DXGI_MODE_DESC DisplayModeList; D3D11_VIEWPORT viewport;
Afficher du rendu 3D :
IDXGISwapChain : interface qui stocke une ou plusieurs surfaces antérieures de rendu avant d’effectuer l’affichage à l’écran.
Voici ses méthodes principales :
/* Accède à une surface de back buffer */ HRESULT GetBuffer( [in] UINT Buffer, [in] REFIID riid, [in, out] void **ppSurface ); /* Obtient les données descriptives de la swap chain */ HRESULT GetDesc( [out] DXGI_SWAP_CHAIN_DESC *pDesc ); /* Affiche une image à l'écran de l'utilisateur */ HRESULT Present( [in] UINT SyncInterval, [in] UINT Flags );
ID3D11Device : interface qui représente un afficheur vidéo. Elle est utilisée soit pour afficher du rendu 3D soit pour créer des ressources.
Voici ses méthodes principales :
/* Créé un buffer quelconque qui peut être un vertex buffer, un index buffer ou un shader-constant buffer */ HRESULT CreateBuffer( [in] const D3D11_BUFFER_DESC *pDesc, [in] const D3D11_SUBRESOURCE_DATA *pInitialData, [out] ID3D11Buffer **ppBuffer ); /* Créé une "depth stencil view" pour accéder aux données des ressources */ HRESULT CreateDepthStencilView( [in] ID3D11Resource *pResource, [in] const D3D11_DEPTH_STENCIL_VIEW_DESC *pDesc, [out] ID3D11DepthStencilView **ppDepthStencilView ); /* Créé un objet "input-layout" qui servira à l'étape de rendu Input Assembler */ HRESULT CreateInputLayout( [in] const D3D11_INPUT_ELEMENT_DESC *pInputElementDescs, [in] UINT NumElements, [in] const void *pShaderBytecodeWithInputSignature, [in] SIZE_T BytecodeLength, [out] ID3D11InputLayout **ppInputLayout ); /* Créé un pixel shader */ HRESULT CreatePixelShader( [in] const void *pShaderBytecode, [in] SIZE_T BytecodeLength, [in] ID3D11ClassLinkage *pClassLinkage, [out] ID3D11PixelShader **ppPixelShader ); /* Créé un vertex shader */ HRESULT CreateVertexShader( [in] const void *pShaderBytecode, [in] SIZE_T BytecodeLength, [in] ID3D11ClassLinkage *pClassLinkage, [out] ID3D11VertexShader **ppVertexShader ); /* Créé les données descriptives sur comment doit réagir l'étape de rendu Razterizer */ HRESULT CreateRasterizerState( [in] const D3D11_RASTERIZER_DESC *pRasterizerDesc, [out] ID3D11RasterizerState **ppRasterizerState ); /* Créé une render-target */ HRESULT CreateRenderTargetView( [in] ID3D11Resource *pResource, [in] const D3D11_RENDER_TARGET_VIEW_DESC *pDesc, [out] ID3D11RenderTargetView **ppRTView ); /* Créé un état depth-stencil */ HRESULT CreateDepthStencilState( [in] const D3D11_DEPTH_STENCIL_DESC *pDepthStencilDesc, [out] ID3D11DepthStencilState **ppDepthStencilState ); /* Créé une ressource shader */ HRESULT CreateShaderResourceView( [in] ID3D11Resource *pResource, [in] const D3D11_SHADER_RESOURCE_VIEW_DESC *pDesc, [out] ID3D11ShaderResourceView **ppSRView ); /* Créé une texture 2D */ HRESULT CreateTexture2D( [in] const D3D11_TEXTURE2D_DESC *pDesc, [in] const D3D11_SUBRESOURCE_DATA *pInitialData, [out] ID3D11Texture2D **ppTexture2D );
ID3D11DeviceContext : une interface qui représente un contexte d’affichage (device context) générant des commandes de rendu.
Voici ses méthodes principales :
/* Marque le début d'une série de commandes graphiques */ void Begin( ID3D11Asynchronous *pAsync ); /* Efface le depth stencil */ void ClearDepthStencilView( [in] ID3D11DepthStencilView *pDepthStencilView, [in] UINT ClearFlags, [in] FLOAT Depth, [in] UINT8 Stencil ); /* Reinitialise tous les élements de la render target à 1 */ void ClearRenderTargetView( [in] ID3D11RenderTargetView *pRenderTargetView, [in] const FLOAT ColorRGBA ); /* Affiche des primitives non indexées */ void Draw( [in] UINT VertexCount, [in] UINT StartVertexLocation ); /* Affiche des primitives indexées */ void DrawIndexed( [in] UINT IndexCount, [in] UINT StartIndexLocation, [in] INT BaseVertexLocation ); /* Relie un index buffer à l'étape de rendu Input Assembler */ void IASetIndexBuffer( [in] ID3D11Buffer *pIndexBuffer, [in] DXGI_FORMAT Format, [in] UINT Offset ); /* Relie un Vertex Input Layout à l'étape de rendu Input Assembler */ void IASetInputLayout( [in] ID3D11InputLayout *pInputLayout ); /* Relie le type de primitive à l'étape de rendu Input Assembler */ void IASetPrimitiveTopology( [in] D3D11_PRIMITIVE_TOPOLOGY Topology ); /* Obtient un pointeur sur la ressource dans la mémoire du GPU, ceci empeche la CG d'accéder à la ressource */ HRESULT Map( ID3D11Resource *pResource, UINT Subresource, D3D11_MAP MapType, UINT MapFlags, D3D11_MAPPED_SUBRESOURCE *pMappedResource ); /* Invalide le pointeur de la ressource dans la mémoire du GPU, redonne l'accès à la ressource par la CG */ void Unmap( ID3D11Resource *pResource, UINT Subresource ); /* Configure l'état du depth-stencil à l'étape de rendu Output Merger*/ void OMSetDepthStencilState( [in] ID3D11DepthStencilState *pDepthStencilState, [in] UINT StencilRef ); /* Relie une ou plusieurs render target automatiquement et en même temps le buffer depth-stencil à l'étape de rendu Output Merger */ void OMSetRenderTargets( [in] UINT NumViews, [in] ID3D11RenderTargetView *const **ppRenderTargetViews, [in] ID3D11DepthStencilView *pDepthStencilView ); /* Configure l'étape de rendu Rasterizer */ void RSSetState( [in] ID3D11RasterizerState *pRasterizerState ); /* Relie un tablea de viewport à l'étape de rendu Rasterizer */ void RSSetViewports( [in] UINT NumViewports, [in] const D3D11_VIEWPORT *pViewports );
ID3D11RenderTargetView : une interface qui représente une render-target (voir lexique) qui peut être accédée lors du rendu.
Elle possède la méthode principale :
GetDesc(D3D11_RENDER_TARGET_VIEW_DESC *pDesc)
ID3D11Texture2D : une interface qui représente une texture constituée de données texel qui
sont stockées dans la mémoire.
Elle possède la méthode principale :
GetDesc(D3D11_TEXTURE2D_DESC *pDesc)
ID3D11DepthStencilState : une interface qui représente l’état du depth-stencil pour que celui-ci
opère des tests à l’étape output-merger.
Elle possède la méthode principale :
GetDesc(D3D11_DEPTH_STENCIL_DESC *pDesc)
ID3D11DepthStencilView : une interface qui peut accéder à une texture paramétrée durant le test du depth-stencil.
Elle possède la méthode principale :
GetDesc(D3D11_DEPTH_STENCIL_VIEW_DESC *pDesc)
Cette structure nommée D3D11_DEPTH_STENCIL_VIEW_DESC est décrite ci-dessous :
struct D3D11_DEPTH_STENCIL_VIEW_DESC {
DXGI_FORMAT Format;
D3D11_DSV_DIMENSION ViewDimension;
UINT Flags;
union {
D3D11_TEX1D_DSV Texture1D;
D3D11_TEX1D_ARRAY_DSV Texture1DArray;
D3D11_TEX2D_DSV Texture2D;
D3D11_TEX2D_ARRAY_DSV Texture2DArray;
D3D11_TEX2DMS_DSV Texture2DMS;
D3D11_TEX2DMS_ARRAY_DSV Texture2DMSArray;
} ;
}
ID3D11RasterizerState : une interface qui permet de configurer l’état du Rasterzizer pour l’étape de rendu Rasterzizer.
Elle possède la méthode principale GetDesc(D3D11_RASTERIZER_DESC *pDesc).
Cette structure nommée D3D11_RASTERIZER_DESC est décrite ci-dessous :
struct D3D11_RASTERIZER_DESC {
D3D11_FILL_MODE FillMode;
D3D11_CULL_MODE CullMode;
BOOL FrontCounterClockwise;
INT DepthBias;
FLOAT DepthBiasClamp;
FLOAT SlopeScaledDepthBias;
BOOL DepthClipEnable;
BOOL ScissorEnable;
BOOL MultisampleEnable;
BOOL AntialiasedLineEnable;
}
Objets de description de données :
Une structure nommée DXGI_SWAP_CHAIN_DESC est décrite ci-dessous :
typedef struct DXGI_SWAP_CHAIN_DESC {
DXGI_MODE_DESC BufferDesc; // Décrit le mode d'affiche du backbuffer
DXGI_SAMPLE_DESC SampleDesc; // Spécifie le super-échantillonnage
DXGI_USAGE BufferUsage; // Décrit le mode d'utilisation du backbuffer
// par le CPU
UINT BufferCount; // Spécifie le nombre de surface de tampon
HWND OutputWindow; // Spécifie l'handle de la fenêtre
// Windows à utiliser
BOOL Windowed; // Mode fenêtré ou non
DXGI_SWAP_EFFECT SwapEffect; // Spécifie la façon dont le contenu est affiché
UINT Flags;
} DXGI_SWAP_CHAIN_DESC;
Une structure nommée D3D11_TEXTURE2D_DESC est décrite ci-dessous :
typedef struct D3D11_TEXTURE2D_DESC {
UINT Width;
UINT Height;
UINT MipLevels;
UINT ArraySize;
DXGI_FORMAT Format;
DXGI_SAMPLE_DESC SampleDesc;
D3D11_USAGE Usage;
UINT BindFlags;
UINT CPUAccessFlags;
UINT MiscFlags;
} D3D11_TEXTURE2D_DESC
Une structure nommée D3D11_VIEWPORT est décrite ci-dessous :
typedef struct D3D11_VIEWPORT {
FLOAT TopLeftX;
FLOAT TopLeftY;
FLOAT Width;
FLOAT Height;
FLOAT MinDepth;
FLOAT MaxDepth;
} D3D11_VIEWPORT;
Résumé :
L’initialisation de DirectX 11 est assez délicate à mettre en œuvre car elle nécessite la manipulation de nombreux d’objets et interfaces associés.
Références :
– Documentation – DirectX SDK – June 2010

