최상단 광고

2012년 4월 9일 월요일

【 셰이더 】 알파합성


" 알파합성 "

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);

댓글 없음: