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는 적절히 사용하면 다양한 아름다운 시각 효과를 만들어낼수 있다. 하지만 블렌딩 자체가 연산을 많이 잡아먹기 때문에 최적화와 시각적 품질 사이의 균형을 알아서 잘 잡자.
'3D Graphics' 카테고리의 다른 글
DirectX11 RTV, SRV등등 View의 역할 (1) | 2024.09.07 |
---|---|
Skinning Animation (4) | 2024.08.28 |
3D Graphics RasterizerState에 대해 알아보자 (0) | 2024.08.21 |
3D Graphics Sampler State에 대해 알아보자 (0) | 2024.08.21 |
3D Graphics Rendering Pipline (0) | 2024.08.19 |