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
};
알파 블렌드를 사용 안하는 설정도 추가해주자.
이제 이 알파블렌드를 활용해서 비와 눈을 만들어보자