Intro :
Nous avons parfois besoin de stocker le rendu 3D dans une texture que l’on pourra utiliser n’importe tout dans le programme !
Explications :
Voici le fichier RenderToTexture.h :
|
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 |
#ifndef RENDER_TO_TEXTURE_H #define RENDER_TO_TEXTURE_H #include <d3d10.h> #include "Types.h" class RenderTarget { public: RenderTarget(); virtual ~RenderTarget(); bool Initialize(uint32 iTextureWidth, uint32 iTextureHeight); void SetRenderTarget(ID3D10DepthStencilView* pDepthStencilView); void ClearRenderTarget(ID3D10DepthStencilView* pDepthStencilView); ID3D10ShaderResourceView* GetShaderResourceView(); private: ID3D10Texture2D* m_pRenderTargetTexture; ID3D10RenderTargetView* m_pRenderTargetView; ID3D10ShaderResourceView* m_pShaderResourceView; }; #endif |
Voici le fichier RenderToTexture.cpp :
|
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 91 92 93 94 95 96 |
#include "Defines.h" #include "RenderTarget.h" #include "D3D10Renderer.h" RenderTarget::RenderTarget() : m_pRenderTargetTexture(nullptr), m_pRenderTargetView(nullptr), m_pShaderResourceView(nullptr) { } RenderTarget::~RenderTarget() { SAFE_RELEASE(m_pRenderTargetTexture); SAFE_RELEASE(m_pRenderTargetView); SAFE_RELEASE(m_pShaderResourceView); } bool RenderTarget::Initialize(uint32 iTextureWidth, uint32 iTextureHeight) { /* On créé les descriptions de texture 2D, de la render target et de la ressource du shader */ D3D10_TEXTURE2D_DESC textureDesc; D3D10_RENDER_TARGET_VIEW_DESC renderTargetViewDesc; D3D10_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc; HRESULT hr; // Initialize the render target texture description. ZeroMemory(&textureDesc, sizeof(textureDesc)); // Setup the render target texture description. textureDesc.Width = iTextureWidth; textureDesc.Height = iTextureHeight; textureDesc.MipLevels = 1; textureDesc.ArraySize = 1; textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; textureDesc.SampleDesc.Count = 1; textureDesc.Usage = D3D10_USAGE_DEFAULT; textureDesc.BindFlags = D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE; textureDesc.CPUAccessFlags = 0; textureDesc.MiscFlags = 0; // Create the render target texture. hr = D3D10_RENDERER->GetDevice()->CreateTexture2D(&textureDesc, NULL, &m_pRenderTargetTexture); if (FAILED(hr)) { return false; } // Setup the description of the render target view. renderTargetViewDesc.Format = textureDesc.Format; renderTargetViewDesc.ViewDimension = D3D10_RTV_DIMENSION_TEXTURE2D; renderTargetViewDesc.Texture2D.MipSlice = 0; // Create the render target view. hr = D3D10_RENDERER->GetDevice()->CreateRenderTargetView(m_pRenderTargetTexture, &renderTargetViewDesc, &m_pRenderTargetView); if (FAILED(hr)) { return false; } // Setup the description of the shader resource view. shaderResourceViewDesc.Format = textureDesc.Format; shaderResourceViewDesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D; shaderResourceViewDesc.Texture2D.MostDetailedMip = 0; shaderResourceViewDesc.Texture2D.MipLevels = 1; // Create the shader resource view. hr = D3D10_RENDERER->GetDevice()->CreateShaderResourceView(m_pRenderTargetTexture, &shaderResourceViewDesc, &m_pShaderResourceView); if (FAILED(hr)) { return false; } return true; } void RenderTarget::SetRenderTarget(ID3D10DepthStencilView* pDepthStencilView) { D3D10_RENDERER->GetDevice()->OMSetRenderTargets(1, &m_pRenderTargetView, pDepthStencilView); } void RenderTarget::ClearRenderTarget(ID3D10DepthStencilView* pDepthStencilView) { float color[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; // On efface le back buffer D3D10_RENDERER->GetDevice()->ClearRenderTargetView(m_pRenderTargetView, color); // On efface le depth buffer D3D10_RENDERER->GetDevice()->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH, 1.0f, 0); } ID3D10ShaderResourceView* RenderTarget::GetShaderResourceView() { return m_pShaderResourceView; } |
Comment l’utiliser ?
|
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 |
void D3D10Renderer::Render() { [...] // Efface la surface de rendu m_pd3dDevice->ClearDepthStencilView(m_pDepthStencilView, D3D10_CLEAR_DEPTH, 1.0f, 0 ); m_pd3dDevice->ClearRenderTargetView(m_pRenderTargetView, afClearColor); SCENE_MANAGER->DrawAll(fTimeSinceLastFrame); RenderToTexture(fTimeSinceLastFrame); m_pQuad->OnRender(fTimeSinceLastFrame); m_pSwapChain->Present(0, 0); } void D3D10Renderer::RenderToTexture(float fTimeSinceLastFrame) { // Set the render target to be the render to texture. m_pQuad->GetRT()->SetRenderTarget(m_pDepthStencilView); // Clear the render to texture. m_pQuad->GetRT()->ClearRenderTarget(m_pDepthStencilView); // Render the scene now and it will draw to the render to texture instead of the back buffer. SCENE_MANAGER->DrawAll(fTimeSinceLastFrame); // Reset the render target back to the original back buffer and not the render to texture anymore. m_pd3dDevice->OMSetRenderTargets(1, &m_pRenderTargetView, m_pDepthStencilView); } |
Résumé :
Nous avons présenter la façon la plus optimale possible d’utiliser une RenderTarget !
Références :


