파티클 간단한 렌더링
http://blog.naver.com/clous02?Redirect=Log&logNo=110023903727
1) 파티클의 버텍스 버퍼이용 방법
* 버텍스 버퍼정의(최대한의 일정한 사이즈로)
* 파티클의 속성을 다룰 구조체를 정의
* 구조체 리스트에 이벤트나 최대 숫자의 개수를 정하고 소멸시 하나를 생성하는 방법으로 생성
* 속성에 존재하는 베텍스 데이터 자료를 버텍스 버퍼로 동적인 복사
* 파티클에 관련된 RenderState를 설정
* 렌더링한다.
2) 작동방식
* FVF의 지정: D3DFVF_XYZ | D3DFVF_PSIZE
* Particle 속성을 위한 구조체
: 동적인 버텍스 생성과 소멸 – List
* 위치 한계의 최대 사이즈 결정
* 버텍스 버퍼 마련
* 파티클을 생성(총알은 속도 일정 위치 변경)
* 버텍스 버퍼에 이동
* 파티클의 생성 – 변경 – 소멸 – 생성의 과정
* 렌더링 : DrawPrimitive(D3DPT_POINTLIST)
3) 파티클 구현 방법
* Particle
- Bilboard이용 파티클 구현(사각형)
- D3DPT_POINTLIST : 하나의 픽셀로 렌더링된다
- Point Sprite(점하나로 가능)
• Texture 적용이 가능 – Blending으로 알파 연산
• 크기 변경 가능
• 하나의 포인트로 사용가능
• 성능향상과 메모리 이익
4) 파티클의 종류
* 일정한 사이즈로 반복 되는 현상
- 눈 비등
- 박스속에 거두고 충돌처리로 사망을 시키면서 사망이 하나라도 벌어지면 자동으로 생성
한다
- 파티클정보를 담고 있는 리스트에서 erase시키고 push_back한다
* 이벤트가 발생하면 생성되는 스타일
- 버텍스 버퍼는 가능한 총알의 최대 사이즈를 지정
- 속성리스트를 만들고 렌더링해야할 만큼 버텍스 버퍼에 지정하고 렌더링한다
- 이벤트 발생시 생성
- 카메라의 위치에서 카메라의 방향으로 발사
- 일정한 위치를 전진하면 소멸
- 생성 – 변경 – 소멸의 단계
* 두가지 방식다
- 위치의 속성은 계속하여 변화함으로 일정한 사이즈로 만들어 놓은 버텍스 버퍼에
위치값을 계속하여 갱신한다
5) 파티클에서 주의할 점
* 파티클 사이즈 조정시 주의할 점
- 렌더스테이트의 사이즈 조정은 모두 DWORD
- 이벤트에 의하여 파티클이 증가할 경우 조정하지 않으면 버텍스 버퍼의 한계를 초가하는 경우가 발생
- 눈이 한 개만 출력될 때는 인덱스 증가가 벌어지지 않기 때문
6) Point Sprite 렌더 상태
* D3DRS_POINTSPRITEENABE : default – false
- true : 지정된 전체 텍스트를 포인트 스프라이트에 텍스쳐 매핑
- false : 포인트 스프라이트의 텍스쳐 좌표를 이용하여 지정
* D3DRS_POINTSCALEENABLE : default – false
- true : 포인트 크기를 뷰스페이스 단위로 해석(카메라와의 거리값에 따라 변화)
- false : 스크린 스페이스 단위로 해석 – 사이즈를 3으로 주면 3x3 사이즈로 그려진다
* D3DRS_POINTSIZE
- 포인트 스프라이트 크기 지정
- Device->SetRenderState(D3DRS_POINTSIZE, FtoDw(2.5f));
DWORD FtoDw(float f)
{
return *((DWORD*)&f);
}
* D3DRS_POINTSIZE_MIN : 0.2
* D3DRS_POINTSIZE_MAX : 5.0
* 거리에 따라 포인트 스프라이드의 크기가 변화하는 방법을 제어
* D3DRS_POINTSIZE_A
* D3DRS_POINTSIZE_B
* D3DRS_POINTSIZE_C