ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [펌] [DIRECTX] CMyD3DApplication의 간단한 함수 설명
    프로그래밍/3D 2005. 11. 3. 08:41

    P.105
    INT WINAPI WinMain()
    {
         CMyD3DApplication d3dApp; // 클래스 생성
         ………
        

          If(FAILED(d3dApp.Create(hInst)) // 초기화
               Return 0;

     

          Return d3dApp.Run();  // 프로그램 시작
    }

     

    애플리케이션 마법사로 Directx 프로그램을 할 때 생성된 클래스

    CD3DApplication을 상속받았다. 이 클래스를 수정해서 프로그램을 만든다.

     

    초기화 과정

     

    D3dApp.Create() -> ConfirmDevice() -> OneTimeSceneInit() -> InitDeviceObjects() -> RestoreDeviceObjects()

     

    D3dApp.Create()

     

    애플리케이션 초기화, HAL을 사용할 수 있는지 여부 등, 현재 시스템에서 실행할 수 있는 디바이스(LPDIRECT3DDEVICE9)를 조사한 뒤 사용 가능한 디바이스로 애플리케이션을 시작

     

    ConfirmDevice()

     

    생성한 디바이스를 조사할 때 호출되는 함수, 직접 코딩
    예를 들어 그래픽 칩이 지원하는 셰이더의 버전이 있는데, 주어진 프로그램에서 사용 하고 있는 셰이더의 버전과 맞지 않으면 에러를 리턴 시켜서 실행할 수 없다고 표현,
    모두 실패하게 되면 프로그램은 종료. 한 개라도 통과하면 실행

    OneTimeSceneInit()

     

    한번만 호출, 최초에 한 번만 읽으면, 나중에는 변경되지 않을 데이터를 읽어드리는데 사용

     

    InitDeviceObjects()

     

    디바이스가 확정되고 나서 호출되는 초기화 함수

    디바이스가 생성된 후의 초기화, HAL을 REF로 전환햇을때도 호출

    디바이스가 바뀌었을때, 재설정이 필요나 오브젝트 처리를 담당

    예를 들어 3D 모델의 등록엔 LPDIRECT3DDEVICE9 디바이스가 필요하므로 이러한 초기화는 모두 여기서 함.

    여기서 확보한 메모리는 DeleteDeviceObjects()에서 해제

     

    RestoreDeviceObjects()

     

    화면의 크기가 바뀐 후에 호출되는 초기화 함수,

    잡다한 인자를 읽어들이는 렌더링 스테이트, 텍스처 스테이지 스테이트 설정 등도 함

    여기서 확보한 메모리는 InvalidateDeviceObjects()에서 해제

     

     

    렌더링 과정

     

    d3dApp.Run()이 호출되면서 렌더링 시작

     

    d3dApp.Run()

     

    윈도우 메시지를 감시, idle 타임에 렌더링 루틴을 호출

     

    화면을 한 프레임 갱신할 때마다 FrameMove()와 Render()가 교대로 호출

    그러나 이것은 보기 좋게 기능을 분리해 놓은 것 뿐 Render에 Framework가 해야할 일을 해도 무방

     

    FrameMove()

     

    오브젝트나 카메라를 작동시키는 작업

    애니메이션 처리 등 담당 

    UpdateInput() 호출되어 키 정보 구조체를 갱신

    키보드 조작을 추가하려면 UserInput 구조체를 추가하거나 UpdateInput()에 키를 추가

     

    Render()

     

    실제 렌더링 코드를 넣어서 렌더링 한다.

    RenderText()를 호출, FPS 값이나 사용중인 그래픽 칩 정보를 표시

     

     

    해제, 재설정 과정

     

    재설정은 3가지 경우에 필요
    - 화면 크기 변경
    - 디비이스 변경
    - 종료시

     

    InvalidateDeviceObjects()

     

    RestoreDeviceObjects()에서 확보한 메모리나 설정을 해제

     

    DeleteDeviceObjects()

     

    InitDeviceObjects()에서 확보한 리소스 해제

     

    FinulCleanUp()

     

    OneTimeSceneInit에서 확보한 메모리 해제

     

    화면 크기가 변경

    프레임버퍼의 크기가 변경되므로 프레임 버퍼의 재설정 필요
    InvalidateDeviceObjects() -> RestoreDeviceObjects() 다시 설정

     

    디바이스 변경

    InvalidateDeviceObjects() -> DeleteDeviceObjects() -> InitDeviceObjects() -> RestoreDeviceObjects()

     

    종료시

    InvalidateDeviceObjects() -> DeleteDeviceObjects() -> FinalCleanUp() -> 소멸자 -> 종료

     

    댓글