" 알파합성 "

 

1. 알파합성이란

  - 폴리곤을 렌더링할 때, 폴리곤 색을 그냥 출력하는 것이 아니라 이미 렌더링된 화면에 여러 가지 합성을 해서 출력하는 방법

 

2. 주의 사항

  - 알파 합성은 현재 그려져 있는 색과 렌더링하는 폴리곤의 색을 합성한다. 따라서 반투명 폴리곤을 렌더링하기 저에, 불투명 오브젝트를 렌더링해야 한다.

 

3. 알파합성 사용법

  // 폴리곤을 반투명으로 렌더링할지 여부 결정

  m_pd3dDeviece->SetRenderState(D3DRS_ALPHABLENDANABLE, TRUE);

  m_pd3dDeviece->SetRenderState(D3DRS_ALPHABLENDANABLE, FALSE);

  // 어떻게 색을 조합할지

  m_pd3dDeviece->SetRenderState(D3dRS_BLENDOP, 값);

  // 폴리곤의 합성 강도

  m_pd3dDeviece->SetRenderState(D3DRS_SRCBLEND, 값A);

  m_pd3dDeviece->SetRenderState(D3DRS_DESTBLEND, 값B);

 

4. 다양한 합성 방법

  - 선형 합성

     : 최종색 = ( 1 - a ) * 바닥색 + a * 덮일색

     m_pd3dDeviece->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

     m_pd3dDeviece->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);

  - 덧셈 합성

     : 최종색 = 바닥색 + a * 덮일색

     : 빛의 표현에 자주 사용

     m_pd3dDeviece->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

     m_pd3dDeviece->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);

  - 뺄셈 합성

     : 최종색 = 바닥색 - a * 덮일색

     : 간단한 그림자 표현에 자주 사용

     m_pd3dDeviece->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_REVSUBTRACT);

     m_pd3dDeviece->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

     m_pd3dDeviece->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);

  - 곱셈 합성

     : 한쪽이 검으면 최종색이 검게 된다.

     : 최종색 = 바닥색 * 덮일색

     m_pd3dDeviece->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR);

     m_pd3dDeviece->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);

  - 제곱 합성

     : 어두운 곳은 더 어둡게 하고, 밝은 곳은 그대로 표시

     : 최종색 = 바닥색 * 바닥색

     m_pd3dDeviece->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTCOLOP);

     m_pd3dDeviece->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);

  - 네거티프 포지티프 반전

     : 흰 폴리곤을 렌더링하면, 검은 부분은 희게, 흰 부분은 검게 출력 되도록 색을 역전하는 변환

     : 최종색 = ( 1 - 바닥색) * 덮일색

     m_pd3dDeviece->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);

     m_pd3dDeviece->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTCOLOR);

  - 불투명

     : 최종색 = 덮일색

     m_pd3dDeviece->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);

     m_pd3dDeviece->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);

+ Recent posts