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 예제 애플리케이션: 투명