오브젝트를 전체적으로 알파블렌딩
이 효과는 페이드효과등에서도 쓸 수 있고요. 게임에서는 죽은 몬스터가 서서히 없어지는 장면이라든지, 새로 리스폰된 몬스터가 서서히 생기는 장면에 응용할 수 있겠죠.
오브젝트를 전체적으로 알파블렌딩 하는 방법은 여러가지가 있습니다.
첫번째로 버텍스 데이터를 이용하는 방법.
두번째로 메테리얼의 각 컬러부분의 알파값을 이용하는 방법.
세번째로 알파맵을 이용하는 방법.
네번째로 특정 상수로 지정하는 방법등이 있습니다.
첫번째의 경우 간단하지만, 매번 버텍스 버퍼를 Lock을 걸어주는 수고를 감수해야합니다. 게다가 모든 버텍스를 순회해야겠죠.
두번째의 경우는 첫번째보단 빠르겠지만, 어쨌든 각 재질값의 알파부분을 바꿔줘야겠죠. 확실히 첫번째의 경우보다는 간단하진 않지만(?) 매번 Lock을 할 필요는 없어보입니다.
세번째의 경우는 특정 부분만 알파값을 적용할 수 있는 장점은 있지만(이 경우는 첫번째도 마찬가지긴 합니다.) 매번 알파맵을 Lock을 걸어 모든 픽셀을 순회하면서 알파값을 고쳐줘야합니다... 힘들기도 하고.. 느리겠죠. 물론 텍스쳐맵을 매우 작게한다면 효율적이긴 합니다. 하지만 그것은 상수와 다를바가 없다 생각합니다.
마지막으로 특정상수로 지정하는 방법입니다. 중요한건 이 값을 어떻게 전달하느냐가 문제인데요. 간단하게 두가지가 있겠습니다. 다음은 오브젝트를 전체적으로 196(76%)줬을 때, 알파블렌딩 하는 방법입니다.
TFACTOR를 이용한 방법
pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
pDevice->SetRenderState( D3DRS_TEXTUREFACTOR, 0xc4000000 );
pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
pDevice->SetTexture( 0, pDiffuseTex );
CONSTANT를 이용한 방법
pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
pDevice->SetTextureStageState( 0, D3DTSS_CONSTANT, 0xc4000000 );
pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_CONSTANT );
pDevice->SetTexture( 0, pDiffuseTex );
하지만, DX도움말에선, 다음과 같이 CONSTANT지원여부에 대한 언급이 있었습니다.
D3DTSS_CONSTANT
Per-stage constant color. To see if a device supports a per-stage constant color, see the D3DPMISCCAPS_PERSTAGECONSTANT constant in D3DPMISCCAPS. D3DTSS_CONSTANT is used by D3DTA_CONSTANT. See D3DTA.
방식을 선택하는 건 전적으로 프로그래머 몫입니다.