Une classe AlphaPass pour activer la transparence (façon RAII)

alpha

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);
}

 

warning

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *