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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/* 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 :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* 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 :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
/* 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 :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
/* 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 :
|
1 |
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 :
|
1 |
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 :
|
1 |
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 :
|
1 |
GetDesc(D3D11_DEPTH_STENCIL_VIEW_DESC *pDesc) |
Cette structure nommée D3D11_DEPTH_STENCIL_VIEW_DESC est décrite ci-dessous :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 :
|
1 2 3 4 5 6 7 8 9 10 11 12 |
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 :
|
1 2 3 4 5 6 7 8 9 10 11 12 |
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 :
|
1 2 3 4 5 6 7 8 9 10 11 12 |
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 :
|
1 2 3 4 5 6 7 8 |
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


