반응형


[2007.12.15] 파티클 (Particle)  Direct3D Study 

2007/12/15 23:12

복사http://blog.naver.com/csm3138/110025403677


파티클(Particle)

- 파티클이란, 아주 작은 입자들로서 게임화면에서 눈, 비, 폭발, 연기등의 특수한 효과를 구현하기

  위하여 사용하는 점단위 입자를 말한다.

- 파티클은 매우 작은 입자이며 하나의 점(point)로 모델링이 이루어진다.

- D3DPRIMITIVETYPE에서 점을 그리는 인자값은 D3DPT_POINTLIST(점단위 렌더링) 이다.

   그러나 파티클을 표현하기 위해서는 D3DPT_POINTSPRITE를 사용한다. D3DPT_POINTSPRITE를

   사용하는 이유는 똑같은 점단위 렌더링을 하지만 POINTSPRITE는 텍스처의 적용이 가능하며,

   크기또한 변경이 가능하기 때문이다.

 

파티클 점(point)를 구성하는 구조체

 strucr   Particle

{

      D3DXVECTOR3   pos;            // 파티클 점의 위치

      D3DCOLOR        color;          // 파티클의 컬러값

      static  const  DWORD  FVF;   // 플래그 값

};

const DWORD Particle::FVF = D3DFVF_XYZ|D3DFVF_DIFFUSE;

-> 이 구조체는 파티클의 한점의 정보를 저장하는 구조체이다. 기본적으로 점의 3차원 위치와

     컬러값, 플래그값을 가지고 있다.

     여기에 부동소수점 변수(float형)를 추가하면 파티클의 크기를 지정할수 있다. 파티클의 크기의

     변경은 직접하기보다는 렌더 상태에서 파티클의 크기를 제어해 주어야 한다. 이유는 직접

     파티클 크기를 변경을 지원하지 않는 그래픽 카드도 있기 때문이다.

 

파티클의 크기지정 변수를 추가한 구조체

struct Particle

{

      D3DXVECTOR3   pos;

      D3DCOLOR        color;

      float                  size;        // 파티클의 크기

      static  const  DWORD  FVF;

};

const  DWORD  Particle::FVF = D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_PSIZE;

-> 플래그값도 하나 더 추가하여 준다. D3DFVF_PSIZE

 

포인트 스프라이트 렌더 상태

- 포인트 스프라이트의 동작들은 거의 대부분 렌더 상태에 의하여 제어된다.

  -> SetRenderState()

 

D3DRS_POINTSPRITEENABLE

- 텍스처 매핑에 이용할 텍스처의 형태를 지정하여준다.

- 값은 bool값으로 true, false 값이다.

true : 현재 지정된 전체 텍스처를 포인트 스프라이트 텍스처 매핑에 사용한다.

false : 스프라이트 텍스처 좌표로 지정한(스프라이트 이미지 좌표값에서) 텍셀을 이용하여 포인트

          스프라이트의 텍스처를 입힌다.

(ex) m_pDevice->SetRenterState(D3DRS_POINTSPRITEENABLE, true);

 

D3DRS_POINTSCALEENABLE

- 포인트의 크기를 뷰 또는 스크린 스페이스 단위로 해석지정을 한다.

true : 포인트의 크기를 뷰스페이스 단위로 해석 지정

false : 포인트 크기를 스크린 스페이스 단위로 해석 지정

(ex) m_pDevice->SetRenderState(D3DRS_POINTSCALEENABLE, true);

 

D3DRS_POINTSIZE

- 포인트 스프라이트의 크기를 지정하여준다.

(ex) m_pDevice->SetRender(D3DRS_POINTSIZE, (크기 DWORD));

 

D3DRS_POINTSIZE_MIN

D3DRS_POINTSIZE_MAX

- 포인트 스프라이트의 최대 크기와 최소 크기를 지정하여 준다.

(ex) m_pDevice->SetRenderState(D3DPT_POINTSIZE_MIN, (크기 DWORD));

       m_pDevice->SetRenderState(D3DPT_POINTSIZE_MAX, (크기 DWORD));

 

D3DRS_POINTSCALE_A

D3DRS_POINTSCALE_B

D3DRS_POINTSCALE_C

- 거리에 따른 포인트 스프라이트의 크기를 제어 한다.

- 최종적인 포인트 스프라이트의 크기는

 이다.

   - ViewportHeight : 뷰포트의 높이

   - A, B, C : SCALE의 값

   - D : 뷰 스페이스(카메라 좌표)내의 포인트 스프라이트와 카메라 위치와의 거리

 

파티클과 파티클의 속성들

- 파티클은 위치와 컬러 이외에도 많은 속성들로 이루어져 있다.

- 파티클을 렌더링할때 필요한 데이터와 속성들은 Particle 구조체가 아닌 Attribute 구조체에 따로

  보관하며, 렌더링할 준비가 완료되면 Particle 구조체로 위치와 속성을 복사하여 사용한다.

- 파티클의 속성은 모델링하려는 파티클 시스템의 종류에 따라 달라진다.

- 다음의 구조체는 몇 가지의 공통적인 파티클 속성을 포함하고 있다.

 struct Attribute

{

        D3DXVECTOR3  pos;                  // 월드 스페이스 내의 파티클의 위치

        D3DXVECTOR3  velocity;             // 파티클의 이동속도, 초당 이동단위

        D3DXVECTOR3  acceleration;      // 파티클의 가속도, 초당 이동단위

        D3DXVECTOR3  lifetime;              // 파티클의 생존시간

        D3DXVECTOR3  age;                  // 파티클의 나이(???)

        D3DXVECTOR3  color;                // 파티클의 컬러

        D3DXVECTOR3  colorfade;          // 파티클의 컬러가 시간의 흐름에 따라 변하는 방법

        D3DXVECTOR3  isalive;              // 파티클 생존유무!! 생존 true, 소멸 false

};

 

 

 

반응형

'그래픽스(Graphics) > DirectX9~12' 카테고리의 다른 글

포샵에서 DDS파일 만들기(2)  (0) 2013.01.31
포샵에서 DDS파일 만들기(1)  (0) 2013.01.31
용책, 해골책  (0) 2013.01.31
간략한 파티클 시스템  (0) 2013.01.31
파티클 간단한 렌더링  (0) 2013.01.31

+ Recent posts