본문 바로가기

공부/DirectX

DirectX11 혼합 -알파블렌딩 설정

독학으로 책에 있는 내용을 정리한 글이에요
알파블렌딩이란
정점정보를 이용해서 텍스처 매핑을 하고
나중에 백버퍼의 픽셀과 블렌딩합니다.
즉 백버퍼에 있는 픽셀이랑 섞는것

혼합기법

래스터화하는 픽셀(원본 픽셀)을 후면버퍼에 이미 래스터화되어 있는 픽셀(대상 픽셀) 과 섞는 기법
혼합기법을 사용하게되면 반투명 물체 랜더링이 가능해진다.

혼합공식(알파블렌딩 공식)

C=C(src)*F(src)+C(dst)*f(dst)
백버퍼색*(1.f-알파)+출력할색*알파
RGB 성분들에만 적용된다.

혼합공식의 이항 + 연산자로 사용될 수 있는 연산자 (계산을 어떻게 할것인지)
D3D11_BLEND_OP

혼합계수
D3D11_BLEND
D3D11_BLEND_ONE (1,1,1)
D3D11_BLEND_ZERO (0,0,0)
A=알파
D3D11_BLEND_SRC_ALPHA A(src)
D3D11_BLEND_INV_SRC_ALPHA 1-A(src)

혼합상태
ID3D11BlendState 인터페이스로 제어한다.
이 인터페이스를 얻으려면 D3D11_BLEND_DESC를 채우고 ID3D11Device::CreateBlendState 메서드를 호출

D3D11_BLEND_DESC 구조체
- BOOL AlphaToCoverageEnable
AlphaToCoverageEnable를 키게되면  알파값을 쓰는지 안쓰는지 구별하게된다.
알파 포괄도 변환이 활성화된다.
알파 안티 에어레이싱(?)
간단하게말하면 알파로 투명화되있는것들은 지우고 출력이된다.

성능이 좋지는 않다.
- BOOL IndependentBlendEnable
DirectX11에서 장면을 최대 8개까지의 랜더 대상들에 동시에 랜더링이 가능하다.
이 플래그를 TRUE로 하면 혼합을 개별적으로 수행이 가능.

- D3D11_RENDER_TARGET_BLEND_DESC RenderTarget[8]
다중 랜더 대상에 적용할 혼합 설정을 담은 구조체 IndependentBlendEnable값이 FALSE라면 RenderTarget[0]을 혼합에 사용

typedef struct D3D11_RENDER_TARGET_BLEND_DESC
{ //기본값과다릅니다 알파블렌딩용이에요
BOOL BlendEnable; //true
D3D11_BLEND SrcBlend; //D3D11_BLEND_SRC_ALPHA
D3D11_BLEND DestBlend; //D3D11_BLEND_INV_SRC_ALPHA
D3D11_BLEND_OP BlendOp; //D3D11_BLEND_OP_ADD
D3D11_BLEND SrcBlendAlpha; //D3D11_BLEND_ONE
D3D11_BLEND DestBlendAlpha; //D3D11_BLEND_ZERO
D3D11_BLEND_OP BlendOpAlpha; //D3D11_BLEND_OP_ADD
UINT8 RenderTargetWriteMask; //D3D11_COLOR_WRITE_ENABLE_ALL 랜더대상 쓰기 마스크 (R,G,B,A 선택가능)
} D3D11_RENDER_TARGET_BLEND_DESC;

이후 BlendState를 생성해준다
device->CreateBlendState(const D3D11_BLEND_DESC* pBlendStateDesc,
ID3D11BlendState** ppBlendState)
-const D3D11_BLEND_DESC* pBlendStateDesc
D3D11_BLEND_DESC 구조체를 생성하고 값을 넣어준다.
-ID3D11BlendState** ppBlendState
혼합상태를 생성한것을 저장하는 공간


생성된 혼합상태 객체는 출력 병합기 단계에 묶어야 한다.
ID3D11:DeviceContext::OMSetBlendState

void ID3D11DeviceContext::OMGetBlendState(
ID3D11BlendState **ppBlendState,
FLOAT BlendFactor[ 4 ],
UINT *pSampleMask);

-ID3D11BlendState **pBlendState
장치에 적용할 혼합 상태 객체를 가리키는 포인터
-FLOAT BlendFactor[ 4 ]
RGBA색상 벡터를 정의한다. 이 색상 벡터는 D3D11_BLEND_BLEND_FACTOR이나
D3D11_BLEND_INV_BLEND_FACTOR를 지정했을때 쓰인다. (안쓰일땐 0으로초기화)
-UINT *pSampleMask
다중표본화는 최대 32개의 표본을 취할 수 있고, 활성화 비활성화 할 수 있다.
일반적으로 기본값인 0xffffffff가 쓰인다. 이 뜻은 어떤 표본도 비활성화 하지 않음을 뜻한다.

'공부 > DirectX' 카테고리의 다른 글

DirectX 레스터라이저  (0) 2021.08.17
DirectX 스탠실 (3D에만 사용)  (0) 2021.08.17
Directx 픽셀충돌  (0) 2021.08.13
DirectX 공간분할  (0) 2021.08.06
DirectX11 카메라  (0) 2021.08.06