3D Graphics

3D Graphics Blend State에 대해 알아보자

hunhun4949 2024. 8. 21. 16:50

BlendState는 3D 그래픽스 파이프라인에서 픽셀 셰이더 출력이 렌더 타겟과 어떻게 결합될지를 결정하는 설정이다. 주로 투명도 처리와 특수 효과 구현에 사용된다.

 

BlendState의 주요 구성 요소와 개념

  • 블렌드 인자(Blend Factor)
    • Source : 픽셀 셰이더에 출력된 색상
    • Destination : 현재 렌더 타겟에 있는 색상
  • 블렌드 연산(Blend Operation)
    • Source와 Destination 색상을 어떻게 조합할지 결정
  • 알파 블렉딩(Alpha Blending)
    • 색상 의 알파 채널을 이용한 투명도 처리
  • 색상 마스크(Color Write Mask)
    • 어떤 색상 채널(R, G, B, A)을 쓸지 결정

주요 블렌드 모드

  • 불투명(Opaque)
    • 기본 설정, 블렌딩 없음
  • 알파 블렌딩(Alpha Blending)
    • 가장 일반적인 투명도 처리 방식
  • 가산 블렌딩(Additive Blending)
    • 색상을 더하는 방식, 빛 효과에서 사용
  • 곱셈 블렌딩(Multiplicative Blending)
    • 색상을 곱하는 방식, 그림자 효과에 사용

 

Direct3D 11에서 사용 예시

D3D11_BLEND_DESC blendDesc;
ZeroMemory(&blendDesc, sizeof(D3D11_BLEND_DESC));

blendDesc.AlphaToCoverageEnable = FALSE;
blendDesc.IndependentBlendEnable = FALSE;

blendDesc.RenderTarget[0].BlendEnable = TRUE;
blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
blendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
blendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;

ID3D11BlendState* pBlendState;
device->CreateBlendState(&blendDesc, &pBlendState);

// 사용
float blendFactor[4] = {0.0f, 0.0f, 0.0f, 0.0f};
UINT sampleMask = 0xffffffff;
deviceContext->OMSetBlendState(pBlendState, blendFactor, sampleMask);

 

주요 블렌드 모드 연산 방법

  • 알파 블렌딩 : 결과색 = (소스색 * 소스알파값) + (대상색 * (1 - 소스 알파값))
  • 가산 블렌딩 : 결과색 = 소스색 + 대상색
  • 곱셈 블렌딩 : 결과색 = 소스색 * 대상색

BlendState의 활용

  • 투명 객체 렌더링
    • 유리, 물, 반투명 효과
  • 파티클 시스템
    • 연기, 불, 마법 효과 등
  • 후처리 효과
    • 블룸, 글로우 효과
  • UI요소
    • 반투명 오버레이, 페이드 인/아웃 효과
  • 특수 렌더링 기법
    • 디퍼드 렌더링의 라이팅 패스

 

BlendState는 적절히 사용하면 다양한 아름다운 시각 효과를 만들어낼수 있다. 하지만 블렌딩 자체가 연산을 많이 잡아먹기 때문에 최적화와 시각적 품질 사이의 균형을 알아서 잘 잡자.