예전에 한번 파티클을 구현해 본적이 있는데 꽤나 단순하게 구현했습니다.
그냥 아무렇게나 규칙에 맞춰 화면에 텍스쳐 잔뜩 뿌려주고, 좌표값 바꿔주고, 색상값 바꿔주고, 로테이션값 바꿔주면 됩니다. 하지만 그냥 이렇게만 하면 자연스러운 파티클은 나오지 않습니다.
위 - 자연스럽지 못한 파티클
아래 - 자연스러운 파티클
DXUTGetD3D9Device()->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
DXUTGetD3D9Device()->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
DXUTGetD3D9Device()->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
Draw하기 전에 위의 세줄을 입력하여 출력결과를 보십시요. 아마... 배경색과 합쳐져서 보이게 될 것입니다. 하지만 배경의 색이 검은색이라면 색이 전혀 합쳐지지 않고 그대로 출력되는 것을 볼 수 있습니다. 하지만 항상 배경색이 검은색으로 돼있을리는 없습니다.
void SetRenderTarget(LPDIRECT3DTEXTURE9 pTexture)
{
LPDIRECT3DSURFACE9 pSurface;
HRESULT hr = pTexture->GetSurfaceLevel(0, &pSurface);
DXUTGetD3D9Device()->SetRenderTarget(0, pSurface);
pSurface->Release();
}
void SetRenderTargetToOrigin(LPDIRECT3DSURFACE9 pTexture, bool EXIT)
{
static LPDIRECT3DSURFACE9 _Origin = pTexture;
DXUTGetD3D9Device()->SetRenderTarget(0,_Origin);
if(EXIT)
_Origin->Release();
}
위의 두 함수는 사용자 정의 함수입니다. 첫번째 역할은 백버퍼를 자신이 원하는 LPDIRECT3DTEXTURE9형을 가진 변수로 바꾸는 것이고, 두번째 함수의 역할은 백버퍼를 원래의 백버퍼로 돌려놓는 것입니다.
SetRenderTarget을 이용해 어떤 텍스처에 그릴지 선택하고 그 텍스처에 r:0 g:0 b:0 a:0으로 색을 맞춰서 클리어해줍니다. 그리고 자신이 그리고 싶은 그림(Texture)을 그립니다(render). 그 다음SetRenderTargetToOrigin함수를 이용해 원래의 백버퍼로 렌더타겟을 잡습니다. 그리고 거기에 아까전에 Render를 마친 텍스쳐를 한번 더 뿌려줍니다.
'Notes > R&D Notes' 카테고리의 다른 글
| 페도라 리눅스 시작하기 (명령어 찾기) (0) | 2010.08.13 |
|---|---|
| vmWare를 이용하여 Linux 설치(Fedora) - 3 (0) | 2010.08.13 |
| vmWare를 이용하여 Linux 설치(Fedora) - 2 (0) | 2010.08.12 |
| vmWare를 이용하여 Linux 설치(Fedora) - 1 (0) | 2010.08.12 |
| 3일만에 제작한 리듬게임... (8) | 2010.01.18 |