• Home
  • About
    • 게임 개발자 유정룡 photo

      게임 개발자 유정룡

      포트폴리오

    • Learn More
    • Email
    • Github
    • Bitbucket
  • Projects
    • All Projects
    • All Tags

Direct3D11 공부 38일차(Weather, AlphaBlend)

29 Jul 2021

Reading time ~1 minute

AlphaBlend

현재 그릴 픽셀과 그려져 있는 픽셀 이 두 픽셀의 값을 결합하는 방식을 블렌딩이라고 한다.

간단하게 식을 보면

SrcColor - 그릴 픽셀 색상

Src - 그릴 픽셀의 Alpha

DestColor - 그려져 있는 픽셀 색상

Dest - Inverse Src Alpha

SrcColor * src OP DestColor * Dest

만약 SrcColor가 (1, 0, 0) 이고 Alpha가 0.2,

DestColor가 (0, 0, 1) 일 경우

(1, 0, 0) * 0.2 + (0, 0, 1) * (1 - 0.2) = (0.2, 0, 0.8)

(0.2, 0, 0.8) 이 색이 나온다.

DirectX에 이 블렌드를 담당하고 있는 구조체가 있다.

typedef struct D3D11_RENDER_TARGET_BLEND_DESC {
  BOOL           BlendEnable;
  D3D11_BLEND    SrcBlend;
  D3D11_BLEND    DestBlend;
  D3D11_BLEND_OP BlendOp;
  D3D11_BLEND    SrcBlendAlpha;
  D3D11_BLEND    DestBlendAlpha;
  D3D11_BLEND_OP BlendOpAlpha;
  UINT8          RenderTargetWriteMask;
} D3D11_RENDER_TARGET_BLEND_DESC;

설명

이 블렌딩을 활용해서 비와 눈을 만들어보자

Shader

00_Global.fx

BlendState AlphaBlend
{
    AlphaToCoverageEnable = false;

    BlendEnable[0] = true;
    SrcBlend[0] = SRC_ALPHA;
    DestBlend[0] = INV_SRC_ALPHA;
    BlendOp[0] = ADD;

    SrcBlendAlpha[0] = One;
    DestBlendAlpha[0] = Zero;
    BlendOpAlpha[0] = Add;

    RenderTargetWriteMask[0] = 15; // 0x0F
};

이 블렌드 스테이트를 추가하자

위에서 설명한 수식을 이용해서 적어주자

AlphaToCoverageEnable 이것은 렌더 타겟에 픽셀값을 설정할 때의 알파값을 사용할지를 설정하는 값이다.

BlendState AlphaBlend_AlphaToCoverageEnable
{
    AlphaToCoverageEnable = true;

    BlendEnable[0] = true;
    SrcBlend[0] = SRC_ALPHA;
    DestBlend[0] = INV_SRC_ALPHA;
    BlendOp[0] = ADD;

    SrcBlendAlpha[0] = One;
    DestBlendAlpha[0] = Zero;
    BlendOpAlpha[0] = Add;

    RenderTargetWriteMask[0] = 15; // 0x0F
};

BlendState AdditiveBlend
{
    AlphaToCoverageEnable = false;

    BlendEnable[0] = true;
    SrcBlend[0] = One;
    DestBlend[0] = One;
    BlendOp[0] = ADD;

    SrcBlendAlpha[0] = One;
    DestBlendAlpha[0] = Zero;
    BlendOpAlpha[0] = Add;

    RenderTargetWriteMask[0] = 15; // 0x0F
};


BlendState AdditiveBlend_AlphaToCoverageEnable
{
    AlphaToCoverageEnable = true;

    BlendEnable[0] = true;
    SrcBlend[0] = One;
    DestBlend[0] = One;
    BlendOp[0] = ADD;

    SrcBlendAlpha[0] = One;
    DestBlendAlpha[0] = Zero;
    BlendOpAlpha[0] = Add;

    RenderTargetWriteMask[0] = 15; // 0x0F
};

알파 블렌드를 사용 안하는 설정도 추가해주자.

이제 이 알파블렌드를 활용해서 비와 눈을 만들어보자



DirectX Share Tweet +1