Transcript DirectX 9

Ch7. 블렌딩
“현재 래스터라이즈 과정에 있는 픽셀과 같은 위치에 있는 이전의 픽셀
을 서로 섞는(조합)하는 테크닉!”
목표
 블렌드의 동작 원리와 이용 방법을 이해한다.
 Direct3D가 지원하는 다양한 블렌드 모드에 대해 배운
다.
 기본형의 투명도를 제어하는 데 알파 성분을 이용하는
방법을 배운다.
7.1 블렌딩 방정식
 현재 계산되고 있는 픽셀(원본 픽셀)을 앞서 쓰여진 픽셀 값(목적지 픽
셀)과 결합하는 방식을 블렌딩.
*블렌딩의 효과는 유리같은 투명효과에 제한되지 않는다.
 현재 그리고 있는 pixel은 back buffer에 먼저 그려져 있는 pixel과
blending되므로, bleding을 이용하기 위해서는 다음의 규칙이 반드시 지
켜져야 한다.
 1. 블렌드를 이용하지 않는 물체를 먼저 그린다.
 2. 블렌드를 이용할 물체들을 카메라와의 거리에 따라 정렬한다.
뷰 스페이스내에 있다면 z 성분을 이용 정렬
 3. 블렌딩을 이용하는 물체들을 뒤에서 앞 순서로 그려나간다.
7.1 블렌딩 방정식
 두 개의 픽셀 값을 섞는 데는 다음의 식이 이용된다.
 outputPixel = sourcePixel ⓧ SourceBlendFactor + DestPixelⓧ DestBlendFactor
각각의 변수는 4D 컬러 벡터 (r, g, b, a)이며 ⓧ 기호는 성분 단위 곱을 나타낸다.
 Pixeloutput - 결과 픽셀
 Pixelsource - back buffer에 있는 pixel과 blend할 현재 pixel
 BlendFactorsource - blend할 원본 pixel의 퍼센트를 지정하는 (0, 1) 범위 내의 값
 Pixeldestination - back buffer 내의 pixel
 BlendFactordestination - blend할 목적지 pixel의 퍼센트를 지정하는 (0, 1) 범위 내
의값
 블렌딩은 디폴트로 비활성화 되어있으며, D3DRS_ALPHABLENDENABLE 렌더
상태를 true로 지정하여 활성화 할 수 있다.
Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
7.2 블렌드 인수
 원본 블렌드 인수와 목적지 블렌드 인수를 지정하기 위해서는 각각
D3DRS_SRCBLEND와 D3DRS_DESTBLEND 렌더 상태를 이용하면 된다.
Device->SetRenderState(D3DRS_SRCBLEND, Source);
Device->SetRenderState(D3DRS_DESTBLEND, Destination);
 Source와 Destination의 값으로는 다음의 블렌드 인수 중 하나를 넣으면 된다.












D3DBLEND_ZERO = (0, 0, 0, 0)
D3DBLEND_ONE = (1, 1, 1, 1)
D3DBLEND_SRCCOLOR = (rs, gs, bs, as)
D3DBLEND_INVSRCCOLOR = (1 - rs, 1 - gs, 1 - bs, 1 - as)
D3DBLEND_SRCALPHA = (as, as, as, as), 원본의 디폴트 값
D3DBLEND_INVSRCALPHA = (1 - as, 1 - as, 1 - as, 1 - as), 목적지의 디폴트 값
D3DBLEND_DESTALPHA = (ad, ad, ad, ad)
D3DBLEND_INVDESTALPHA = (1 - ad, 1 - ad, 1 - ad, 1 - ad)
D3DBLEND_DESTCOLOR = (rd, gd, bd, ad)
D3DBLEND_INVDESTCOLOR = (1 - rd, 1 - gd, 1 - bd, 1 - ad)
D3DBLEND_SRCALPHASAT = (f, f, f, 1) (f: = min(as, 1 - ad)
D3DBLEND_BOTHINVSRCALPHA = 원본을 (1 - rs, 1 - gs, 1 - bs, 1 - as)로, 목적지를 (rs, gs, bs, as)로 지정한다.
D3DRS_SRCBLEND에만 이용할 수 있다.
 디폴트 값은 각각 D3DBLEND_SRCALPHA와 D3DBLEND_INVSRCALPHA이다.
7.3 투명
 알파 성분을 주로 사용하는 곳이 바로 블렌딩이다.
 알파 성분은 주로 픽셀의 투명도 단계를 지정하는데 이용된다. 각 픽셀의 알파
성분에 8비트씩을 할당했다고 가정하면, 알파 성분은 [0, 255]의 범위를 가지며
이는 실제로 [0%, 100%] 불투명도에 해당된다. 즉, 알파 값이 0이면 완전히 투명
하며, 알파 값이 128이면 50% 투명하고, 255이면 완전히 불투명하게 표현된다.
 알파 성분으로 알파의 투명도를 지정하기 위해서는 디폴트 인수인
D3DBLEND_SRCALPHA(for source)와 D3DBLEND_INVSRCALPHA(for
destination)로 지정해야 한다.
7.3.1 알파 채널
 셰이딩에서 계산된 알파 성분을 이용하는 방법 이외에도 텍스처의 알파
채널에서 알파 정보를 얻는 방법이 있다.
알파 채널은 알파 성분을 보관하기 위해 각 텍셀에 할당된 비트들이다.
-기본형에 텍스처를 매핑할 때는 알파 채널의 알파 성분 또한 매핑되며,
이는 곧 텍스처를 입힌 기본형 픽셀의 알파 성분이 된다.
7.3.2 알파 채널 원본 지정하기
 디폴트로,
현재 텍스처가 알파 채널을 가지고 있는 경우에는 알파 채널에서 알파를 얻음
만약 알파 채널이 없다면 버텍스 컬러에서 알파를 얻는다.
 렌더 상태를 이용하면 어떤 원본을(난반사 컬러나 알파 채널) 이용할 것인지를
지정할 수 있다.
// shading 과정에서 diffuse 컬러로 alpha를 계산한다.
g_device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
g_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
// alpha 채널에서 alpha를 얻는다.
g_device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
g_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
7.4 DirectX 텍스처 툴로 알파 채
널 만들기
 P. 184참조^-^♡
7.5 예제 애플리케이션: 투명