04
22

알파 테스팅과 알파 블랜딩은 알파채널을 이용해서 투명하게 만들어준다.

 

알파 블랜딩은 알파맵, 알파 채널의 비율에 따라서 투명하게 만든다.

알파 테스팅은 50%의 알파 채널 이하는 투명도가 없는 것으로 한다.

극단적으로 투명인지 아닌지 판별하는 작업이다. 

 

알파 소팅 (Alpha Sorting)

반투명 오브젝트 끼리 렌더링 할때는 Zbuffer의 문제가 생긴다.

렌더링할때, 가려진 오브젝트는 렌더링하지않는다. (Culling)

하지만 반투명, 투명은 뒤에 있는 오브젝트가 그려져야한다.

 

 

위는 본인 다이렉트 엔진에서 나무잎을 그리는 사진으로 

알파값 뒤에 오브젝트가 가려져서 컬링이 되고 있는 모습이다.

 

출처 : https://www.slideshare.net/jpcorp/5-10351002

 

알파 값이 있는 것은 Zbuffer문제가 생기고 

알파소팅의 헛점이라고 한다.  

 

알파 테스팅

이를 해결하는 Zbuffer의 ZWriteZRead나 알파테스팅 여러 꼼수가 있지만, 

알파 테스팅을 사용하면 알파 블렌딩의 앞뒤 판정이 쉽게 해결된다. 

픽셀셰이더에서 알파맵의 알파를 뺀 최종 알파값을

0.5f 절반보다 작다면 그냥 그 픽셀을 날려버린다. 

알파 값이 0.5f 절반이라면 CutOff 해버림

알파 테스팅은 50%의 알파 채널 이하는 투명도가 없는 것으로 취급하는거다.

discard는 픽셀을 아예 버리는것이다. 

결과

 

나무잎이 풍성하게 잘 보이는 모습이다.

픽셀쉐이더 사용해서 알파테스팅을 했는데,

DirectX의 Output Merger Stage OM statge에서 Blend State의 설정에 따라

알파테스팅이 가능하다.

AlphatoCoverageEnable은 Direcx10부터 정식으로 생긴 기능으로

멀티 샘플링에서 렌더타겟에 픽셀값을 설정할때의 알파값을 사용할지 설정한다.

 

HRESULT KState::CreateBlendState()
{
    HRESULT hr = S_OK;
    D3D11_BLEND_DESC bd;
    ZeroMemory(&bd, sizeof(D3D11_BLEND_DESC));

    bd.AlphaToCoverageEnable = false;
    bd.IndependentBlendEnable = true;
    bd.RenderTarget[0].BlendEnable = TRUE;
    bd.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
    bd.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
    bd.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
    //// A 연산 저장
    bd.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
    bd.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
    bd.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
    bd.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
    hr = g_pd3dDevice->CreateBlendState(&bd, &g_pBlendState);
    if (FAILED(hr))
    {
        return hr;
    }
COMMENT