Intro :
Pour afficher rapidement du contenu 3D, il est laborieux de déclarer à chaque fois les vertex et index buffers, le shader associé, le Vertex Input Layout, la méthode d’affichage, etc…
Cette classe suivante vous permettra de restreindre ces difficultés.
Prérequis :
– Savoir utiliser la classe ShaderTechnique. Voir cet article.
– Savoir un peu utiliser DirectX 10.
Explications :
Voici le fichier Renderable.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 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 |
#ifndef RENDERABLE_H #define RENDERABLE_H class ShaderTechnique; class Renderable { public: enum DrawMethod { DRAW_NORMAL, DRAW_INDEXED }; Renderable(); virtual ~Renderable(); virtual void Render(float fTimeSinceLastFrame); void SetShaderTechnique(ShaderTechnique* pShader); ShaderTechnique* GetShaderTechnique(); void SetVertexType(VertexLayoutType vertexType); void SetDrawMethod(DrawMethod drawMethod); void SetTopology(D3D_PRIMITIVE_TOPOLOGY topology); void SetRenderableName(const std::string& sName); std::string GetRenderableName(); protected: void SetVertexBuffer(ID3D10Buffer* pBuffer); void SetIndexBuffer(ID3D10Buffer* pBuffer); ID3D10Buffer* GetVertexBuffer(); ID3D10Buffer* GetIndexBuffer(); protected: unsigned int m_iVerticesCount; unsigned int m_iIndicesCount; ID3D10Buffer* m_pVertexBuffer; ID3D10Buffer* m_pIndexBuffer; private: void Draw(); void InitVertexBuffer(); void InitIndexBuffer(); private: VertexLayoutType m_vertexType; DrawMethod m_drawMethod; D3D_PRIMITIVE_TOPOLOGY m_topology; ShaderTechnique* m_pShader; std::string m_sName; }; #endif |
Voici le fichier Renderale.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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
#include "Renderable.h" Renderable::Renderable() : m_pShader(nullptr), m_vertexType(VertexLayoutType::PTN_VERTEX), m_drawMethod(DrawMethod::DRAW_NORMAL), m_topology(D3D_PRIMITIVE_TOPOLOGY::D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST), m_iIndicesCount(0), m_iVerticesCount(0), m_pVertexBuffer(nullptr), m_pIndexBuffer(nullptr) { } Renderable::~Renderable() { SAFE_RELEASE(m_pIndexBuffer); SAFE_RELEASE(m_pVertexBuffer); } void Renderable::SetShaderTechnique(ShaderTechnique* pShader) { Assert(pShader); bool bSucess = pShader->Initialize(); if (bSucess) { m_pShader = pShader; } } ShaderTechnique* Renderable::GetShaderTechnique() { return m_pShader; } void Renderable::Render(float fTimeSinceLastFrame) { if (m_pShader == nullptr) { return; } D3D10_RENDERER->GetDevice()->IASetInputLayout(m_pShader->GetVertexLayout()); D3D10_RENDERER->GetDevice()->IASetPrimitiveTopology(m_topology); InitIndexBuffer(); InitVertexBuffer(); m_pShader->Update(fTimeSinceLastFrame); D3D10_TECHNIQUE_DESC techDesc; ID3D10EffectTechnique* pTechnique = m_pShader->GetShaderTechnique(); pTechnique->GetDesc(&techDesc); for (unsigned int p = 0; p < techDesc.Passes; p++) { pTechnique->GetPassByIndex(p)->Apply(0); Draw(); } } void Renderable::Draw() { if (m_drawMethod == DrawMethod::DRAW_NORMAL) { D3D10_RENDERER->GetDevice()->Draw(m_iVerticesCount, 0); } else if (m_drawMethod == DrawMethod::DRAW_INDEXED) { D3D10_RENDERER->GetDevice()->DrawIndexed(m_iIndicesCount, 0, 0); } } void Renderable::InitVertexBuffer() { if (m_pVertexBuffer) { UINT stride = D3D10_RENDERER->GetVertexBytesSize(m_vertexType); UINT offset = 0; D3D10_RENDERER->GetDevice()->IASetVertexBuffers(0, 1, &m_pVertexBuffer, &stride, &offset); } } void Renderable::InitIndexBuffer() { if (m_pIndexBuffer) { D3D10_RENDERER->GetDevice()->IASetIndexBuffer(m_pIndexBuffer, DXGI_FORMAT_R16_UINT, 0); } } void Renderable::SetDrawMethod(DrawMethod drawMethod) { m_drawMethod = drawMethod; } void Renderable::SetTopology(D3D_PRIMITIVE_TOPOLOGY topology) { m_topology = topology; } void Renderable::SetVertexType(VertexLayoutType vertexType) { m_vertexType = vertexType; } void Renderable::SetRenderableName(const std::string& sName) { m_sName = sName; } std::string Renderable::GetRenderableName() { return m_sName; } void Renderable::SetVertexBuffer(ID3D10Buffer* pBuffer) { m_pVertexBuffer = pBuffer; } void Renderable::SetIndexBuffer(ID3D10Buffer* pBuffer) { m_pIndexBuffer = pBuffer; } ID3D10Buffer* Renderable::GetVertexBuffer() { return m_pVertexBuffer; } ID3D10Buffer* Renderable::GetIndexBuffer() { return m_pIndexBuffer; } |
Résumé :
Cette classe pourra servir à être dérivée pour afficher vos contenus 3D : image, quad de post-effect, rendu 3D, etc..


