GamePrograming/Direct3D 블렌딩 Angler.lee 2009. 5. 4. 22:53 알파 테스트와 알파블렌딩에 대한 설명은 윗분이 설명해주신데로(DX 도움말에 있는데로)입니다. D3DRS_ALPHATESTENABLE가 TRUE로 설정되어 있을때 D3DRS_ALPHAFUNC이 D3DRS_ALPHAREF을 이용해서 테스트를 실행합니다.D3DRS_ALPHATESTENABLE가 FALSE이면 당연히 D3DRS_ALPHAFUNC, D3DRS_ALPHAREF는 설정안하셔도 됩니다.그리고 알파테스트를 통과했을 경우에 한해서 알파블렌딩이 일어납니다.참고로,알파테스트를 통해서 알파블렌딩할 영역을 줄여주는게 퍼포먼스에 도움이 됩니다 //알파테스팅 - Z축에 대한 알파가 먹히게 된다. m_pDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE); m_pDevice->SetRenderState( D3DRS_ALPHAREF, 0x08 ); m_pDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); //알파블랜딩 - 일반적 반투명 알파로서 그려지는 순서대로 알파가 먹힌다.(Z축에 대한 알파 안먹힘) m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE); m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); //D3DBLEND_INVSRCALPHA -> D3DBLEND_ONE 로 하면 더 밝게 알파연산을 할 수 있으나 원래 이미지가 퇴색 //텍스처컬러와 디퓨즈(버텍스컬러)컬러 를 모듈레이트 시켜서 출력시킨다. //텍스처알파와 디퓨즈(버텍스알파)알파 를 모듈레이트 시켜서 출력시킨다. m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); //텍스처컬러와 백터컬러를 모듈레이트 시켜서 출력한다 //텍스처알파와 백터알파를 모듈레이트 시켜서 출력한다. m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR, D3DXCOLOR); m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR); m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR); m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE); ---------------------------------------------------------------------------------------- 특정 텍스처에 알파값 변경하기 DWORD alpha = 175; -> 일정 시간마다 요 값만 변경해주면 알파값이 변한다. driver->getDevice()->SetRenderState(D3DRS_TEXTUREFACTOR, (0x00ffffff)+(alpha<<24)); driver->getDevice()->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); driver->getDevice()->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); driver->getDevice()->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); driver->getDevice()->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); driver->getDevice()->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR ); 설정해주고, setTexture()한 뒤, render한다. 그리고 나서 SetRenderState(D3DRS_TEXTUREFACTOR, 0xffffffff); <-- 요걸 반드시 해주자. 해주지 않는다면, 그 외 다른 텍스처에도 알파값이 전부 적용되어 버린다!!ㅋ