Intro :
Parfois on veut afficher certaines modèles tout en activant la transparence.
Ici je présente une façon simple de gérer cela avec le principe du RAII.
Prérequis :
– Comprendre le principe du RAII
– Savoir initialiser DirectX 10 à travers la classe D3D10Renderer
Explications :
Voici le code du fichier AlphaPass.h :
#ifndef ALPHA_PASS_H
#define ALPHA_PASS_H
#include <d3dx10math.h>
class AlphaPass
{
public:
AlphaPass();
virtual ~AlphaPass();
protected:
ID3D10BlendState* m_pOldBlendState;
float m_OldBlendFactor[4];
unsigned int m_OldSampleMask;
ID3D10BlendState* m_pCurrentBlendState;
};
#endif
Voici le fichier AlphaPass.cpp :
#include "AlphaPass.h"
AlphaPass::AlphaPass() :
m_pOldBlendState(nullptr),
m_pCurrentBlendState(nullptr)
{
D3D10_RENDERER->GetDevice()->OMGetBlendState(&m_pOldBlendState, m_OldBlendFactor, &m_OldSampleMask);
m_pCurrentBlendState = nullptr;
D3D10_BLEND_DESC BlendState;
ZeroMemory(&BlendState, sizeof(D3D10_BLEND_DESC));
BlendState.BlendEnable[0] = TRUE;
BlendState.SrcBlend = D3D10_BLEND_SRC_ALPHA;
BlendState.DestBlend = D3D10_BLEND_INV_SRC_ALPHA;
BlendState.BlendOp = D3D10_BLEND_OP_ADD;
BlendState.SrcBlendAlpha = D3D10_BLEND_ZERO;
BlendState.DestBlendAlpha = D3D10_BLEND_ZERO;
BlendState.BlendOpAlpha = D3D10_BLEND_OP_ADD;
BlendState.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL;
D3D10_RENDERER->GetDevice()->CreateBlendState(&BlendState, &m_pCurrentBlendState);
D3D10_RENDERER->GetDevice()->OMSetBlendState(m_pCurrentBlendState, 0, 0xffffffff);
}
AlphaPass::~AlphaPass()
{
D3D10_RENDERER->GetDevice()->OMSetBlendState(m_pOldBlendState, m_OldBlendFactor, m_OldSampleMask);
SAFE_RELEASE(m_pCurrentBlendState);
SAFE_RELEASE(m_pOldBlendState);
}

Vos entités transparentes doivent être affichées en dernier lors de le boucle de rendu et tout en désactivant le Z-Buffer.
Résumé :
Nous avons établi un objet AlphaPass qui permet d’activer, lors de sa création sur la pile, la transparence dans le rendu. La transparence est restauré lors de la destruction de l’objet en sortant du bloc de code.

