본문 바로가기

프로그래밍 -----------------------/C,C++ 팁

알파 블렌딩


불펌자료;;;;  -_-;;;;; 출저까먹음... 

블렌딩 
디폴트 = FALSE - D3DRS_ALPHABLENDENABLE 렌더 상태를 TRUE로 하여서 사용한다.

255 불투명, 0 투명
//Enable alpha blending
g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
//Destination이 멀리 있는것(원래있는것) ex.유리창이 소스라고 하면 유리창 너머 보이는 것이 dest
//즉 현재 그릴 것이 source이고 원래 그려져 있는 것이 destination이다.

OutputPixel = SourcePixel ⓧ SourceBlendFactor + DestPixel ⓧ DestBlendFactor
ⓧ는 r,g,b,a 각각 곱하는 연산.

OutputPixel - 블렌드 결과 픽셀
SourcePixel - 후면버퍼의 픽셀과 블렌드할 현재 픽셀
SourceBlendFactor - 블렌드할 원본 픽셀의 퍼센트를 지정하는 [0,1] 범위 내의 값
DestPixel - 후면 버퍼 내의 픽셀
DestBlendFactor - 블렌드할 목적지 픽셀의 퍼센트를 지정하는 [0,1] 범위 내의 값
--------------------------------------------------------------------------------
지원 되고 있는혼합 모드를 정의한다.

.
typedef enum _D3DBLEND {
D3DBLEND_ZERO = 1,
D3DBLEND_ONE = 2,
D3DBLEND_SRCCOLOR = 3,
D3DBLEND_INVSRCCOLOR = 4,
D3DBLEND_SRCALPHA = 5,
D3DBLEND_INVSRCALPHA = 6,
D3DBLEND_DESTALPHA = 7,
D3DBLEND_INVDESTALPHA = 8,
D3DBLEND_DESTCOLOR = 9,
D3DBLEND_INVDESTCOLOR = 10,
D3DBLEND_SRCALPHASAT = 11,
D3DBLEND_BOTHSRCALPHA = 12,
D3DBLEND_BOTHINVSRCALPHA = 13,
D3DBLEND_BLENDFACTOR = 14,
D3DBLEND_INVBLENDFACTOR = 15,
D3DBLEND_FORCE_DWORD = 0x7fffffff
} D3DBLEND;

정수

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(A, 1-Ad).

D3DBLEND_BOTHSRCALPHA
사용하지 않는다. Microsoft DirectX 6.0 이후에서는, 전송원 및 목적지의 혼합 계수에 D3DBLEND_SRCALPHA 과 D3DBLEND_INVSRCALPHA 를 각각 다른 호출로 설정하는 것으로써, 같은 효과를 얻을 수 있다.

D3DBLEND_BOTHINVSRCALPHA
전송원의 혼합 계수는 (1 - As, 1 - As, 1 - As, 1 - As)으로, 목적지의 혼합 계수는 (As, As, As, As)이다. 목적지의 혼합의 선택은 덧쓰기된다. 이 혼합 모드는,D3DRS_SRCBLEND 렌더링 스테이트 에 대해서만 지원 된다.

D3DBLEND_BLENDFACTOR
frame buffer 블렌더가 사용하는 정수 컬러 혼합 계수. D3DPBLEND_BLENDFACTOR 가 온의 경우만, 이 혼합 모드가 지원 된다.

D3DBLEND_INVBLENDFACTOR
frame buffer 블렌더가 사용하는 정수 컬러 혼합 계수의 보수. D3DCAPS9 의 SrcBlendCaps 또는 DestBlendCaps 멤버에 D3DPBLEND_BLENDFACTOR 비트가 설정되어 있는 경우에만, 이 혼합 모드가 지원 된다.

D3DBLEND_FORCE_DWORD
이 열거형을 강제적으로 32 비트 사이즈에 컴파일 한다. 이 값은 사용되지 않았다.

주의

전술의 멤버의 설명에서는, 전송원 및 목적지의 RGBA 값은 첨자 s 및 d 에 의해 나타난다.

이 열거형의 값은,D3DRS_DESTBLEND 렌더링 스테이트에 의해 사용된다.

열거형의 정보

헤더 d3d9types.h
최저한의 operating system Windows 98

참조

D3DRENDERSTATETYPE


Z버퍼를 잘 사용합시다.

g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); //앞에서 해줬다.
g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
//D3DRS_ZENABLE, TRUE 이고 D3DRS_ZWRITEENABLE을 FALSE로 하면
//1. 원래z버퍼에 기입되어 있는 물체들과는 z버퍼 비교 연산을 한다. (D3DRS_ZENABLE이 TRUE이니까)
//2. 하지만 자신의 z값은 z버퍼에 기입하지 않는다.
//3. 따라서 이전에 버퍼에 그려진 것들과는 z값을 비교해서 순서정열이 된다(제대로 나온다)
//4. 하지만 자신이 그린것 뒤에 그리는 것은 자신이 z버퍼에 값을 기입하지 않았으므로 가리게 된다.
//참고 : D3DRS_ZENABLE, TRUE(z버퍼를쓴다) 라고 설정하는 것은 자신의 z값을 z버퍼와 비교해서 처리 하겠다는 의미이다.
//참고 : D3DRS_ZENABLE, TRUE D3DRS_ZWRITEENABLE, FALSE 로 하면 다음에 그리는 그림이 z버퍼를 비교할때 자신이 없으니까 덮어써진다.
//참고 : 파티클은 일반적으로 효과에 쓰니까, 제일 마지막에 랜더링 하면 되겠다.


알파테스트

g_pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE ); //알파테스트
//투명하게 처리할 기준 알파값 지정(2번째 인자값 이하의 알파값을 투명하게 처리)
g_pd3dDevice->SetRenderState( D3DRS_ALPHAREF, 0x08 ); //기준 알파값
//DWORD check;
//g_pd3dDevice->GetRenderState( D3DRS_ALPHAFUNC, &check); //나중에 값 되돌려 줄 일 있음 쓰려고.
g_pd3dDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); //연산할 값.
//기준 알파값 이하 알파값을 완전히 없앰(연산하지 않아서 투명이 됨)


옵션을 줘서 파일 읽어올때

D3DXCreateTextureFromFileExA( g_pd3dDevice,
"Images/Particle.bmp",
//"Images/mounds.jpg",
D3DX_DEFAULT,
D3DX_DEFAULT,
D3DX_DEFAULT,
NULL,
D3DFMT_A8R8G8B8,//D3DFMT_UNKNOWN, D3DFMT_A8R8G8B8
//아래 색을 알파값으로 쓰겠다.
D3DPOOL_MANAGED,
D3DX_DEFAULT,
D3DX_DEFAULT,
0xff000000, //ColorKey 검은색 뺐다.
//D3DFMT_A8R8G8B8옵션일때만 알파값으로 인정한다.
//컬러키가 알파값으로 인식된다.
//0xA 값은 ff이면 투명으로 아니면 모두 알파가 불투명으로 생각
NULL,
NULL,
&m_pParticleTexture );