현재 구현해야하는 블랜딩이..
Sa = 소스알파
Sc = 소스컬러
Fa = 프레임에적용하는 FactorAlpha
BFa = Sa * Fa
BF~a = 1 - (Sa * Fa)
즉.. 소스의 알파값에 커스텀 알파값을 곱해 블랜딩을 줘야하는 상황이구요..
텍스쳐는 1개만 사용하고 생성시 텍스쳐에 알파값이 매겨져있습니다.
아래는 블랜딩 공식입니다.
Dc * BF~a + Sc * BFa
현재 제가 구현한 소스입니다.
if(BAlpha<255)
{
_pD3DDevice->SetRenderState( D3DRS_SEPARATEALPHABLENDENABLE , TRUE );
_pD3DDevice->SetRenderState( D3DRS_BLENDFACTOR , D3DCOLOR_ARGB(BAlpha,BAlpha,BAlpha,BAlpha) );
_pD3DDevice->SetRenderState( D3DRS_SRCBLEND , D3DBLEND_BLENDFACTOR );
_pD3DDevice->SetRenderState( D3DRS_DESTBLEND , D3DBLEND_INVBLENDFACTOR );
_pD3DDevice->SetRenderState( D3DRS_SRCBLENDALPHA , D3DBLEND_SRCALPHA );
_pD3DDevice->SetRenderState( D3DRS_DESTBLENDALPHA , D3DBLEND_INVSRCALPHA );
_pD3DDevice->SetRenderState( D3DRS_BLENDOPALPHA , D3DBLENDOP_ADD );
}
else
{
_pD3DDevice->SetRenderState( D3DRS_SRCBLEND , D3DBLEND_SRCALPHA );
_pD3DDevice->SetRenderState( D3DRS_DESTBLEND , D3DBLEND_INVSRCALPHA );
}
_pD3DDevice->SetRenderState( D3DRS_BLENDOP , D3DBLENDOP_ADD );
_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
결과적으로 블랜딩은 되는데 색깔이 이상하게 나오게 됨니다.
알파채널로 뚤려야 하는곳에도 엉뚱한 색깔이 나오고있습니다..
도와주세요..ㅠ
블랜딩 op 도와주세요
Moderator: 류광
해결했습니다..
자문 자답이 되었네요..
버텍스에 디퓨즈값의 알파채널에 값을넣고..
_pD3DDevice->SetRenderState( D3DRS_SRCBLEND , D3DBLEND_SRCALPHA );
_pD3DDevice->SetRenderState( D3DRS_DESTBLEND , D3DBLEND_INVSRCALPHA );
_pD3DDevice->SetRenderState( D3DRS_BLENDOP , D3DBLENDOP_ADD );
_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
... 텍스쳐에서 알파만 곱해서 해결했네요;
버텍스에 디퓨즈값의 알파채널에 값을넣고..
_pD3DDevice->SetRenderState( D3DRS_SRCBLEND , D3DBLEND_SRCALPHA );
_pD3DDevice->SetRenderState( D3DRS_DESTBLEND , D3DBLEND_INVSRCALPHA );
_pD3DDevice->SetRenderState( D3DRS_BLENDOP , D3DBLENDOP_ADD );
_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
... 텍스쳐에서 알파만 곱해서 해결했네요;