ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mesh에 관한 기초 내용 정리
    Programing/DirectX 2008. 5. 23. 15:06
    메쉬에 대한 내용에 앞서..우선
    ID3DXBaseMesh에 대해서 알아보자.(정보문화사의 용책을 보고 정리해본다.)

    1. ID3DXBaseMesh

    ID3DXBaseMesh은 ID3DXMesh, ID3DXPMeshe등을 상속한다.

    ID3DXBaseMesh 인터페이스는 메쉬의 버텍스를 보관하는 버텍스 버퍼와 구성을 정의하는 인덱스 버퍼 모두를 포함한다.
    GetVertexBuffer 와 GetIndexBuffer 를 사용하면 각각의 포인터를 얻을수 있다.
    만약 버퍼의 쓰기나 읽기를 원한다면 버텍스와 마찬가지로 LOCK()함수를 사용해야 한다.
    LockVertexBuffer()LockIndexBuffer()를 사용하는 것이다. 각각 두가지의 인자를 가지는데 첫번째는 잠금 플래그 형식지정이고, 2번째는 잠근 메모리를 가리킬 포인터의 주소이다.
    마찬가지로 작업이 끝나면 UnLock()함수를 사용해야한다.


    2. 서브셋

    메쉬는 하나 이상의 서브셋으로 구성된다. 서브셋이란 동일한 속성을 가진 삼각형 메쉬들의 집합을 말하는 것이다. 이 서브셋은 각각 독특한 양의 정수 값인 속성 아이디를 가지게 된다. 이 속성 ID들은 DWORD 배열인 속성 버퍼 내에 보관되어지게 된다. 각각의 면들은 하나의 속성을 가지게 되므로 면들의 수와 속성버퍼내의 요소 수는 같게 된다. 또한 속성 버퍼 내의 항목과 인덱스 버퍼에 정의된 삼각형들 역시 같은 값을 가지게 된다.
    이런 특성을 지닌 속성버퍼에 접근하기 위해서는 LockAttributeBuffer()를 사용하여야 한다.
    그리고 서브셋을 그리기 위하여 DrawSubset(DWORD ID) 메서드를 사용하여야 한다. 예를 들어 서브셋 0에 존재하는 모든 삼각형을 그리고자 한다면 다음과 같이 메서드를 호출하면 된다.
    Mesh -> DrawSubset(0);
    자 이쯤 되었으니..우리는 메쉬의 모든 서브셋을 그릴수 있는 방법을 생각해볼수있다. 간단히 for문을 사용하면 이것이 가능하게 되는것이다.

    for(int i = 0; i < NumSubsets; i++)
      {
       p_Device->SetMaterial ( mtrls[i] );
       p_Device->SetTexture( 0, Textures[i] );
       Mesh->DrawSubset( i );
      }


    3. 최적화 하기


    좀더 효과적으로 메쉬를 렌더링하기 위해서 버텍스와 인덱스를 재구성하는 것이 좋다. 이를 최적화작업이라하며 OptimizeInplace() 함수를 사용하여 이같은 작업을 할 수 있다.

    HRESULT OptimizeInplace(      

        DWORD Flags,    CONST DWORD *pAdjacencyIn,    DWORD *pAdjacencyOut,    DWORD *pFaceRemap,    LPD3DXBUFFER *ppVertexRemap );
    첫번째 인자는 수행할 최적화의 종류를 알려주는 최적화 플래그이다. ( D3DXMESHOPT)
     여러가지 플래그들이 있지만 사용빈도가 높은 D3DXMESHOPT_ATTRSORT 은 속성으로 삼각형을 정렬하고 속성 테이블을 생성해준다.
    두번째 인자는 최적화되지 않은 메쉬의 인접 배열포인터
    세번째는 최적화된 메쉬의 인접 정보로 채워질 DWORD배열 포인터(GetNumFaces *3 수의 요소를 가지고 있어야 한다.)
    네번째 인자는 각면의 새로운 인덱스를 저장하고 있는 목적지 버퍼의 포인터(GetNumFaces()의 크기를 가진다.)이 정보가 필요치 않다면 0을 전달한다.
    마지막 인자는 각 정점의 새로운 인덱스를 저장하는 ID3DXBuffer 인터페이스의 포인터 주소. 이정보가 필요치 않다면 0을 전달한다.

    따라서 최적화되지 않은 메쉬의 인접 정보를 얻고(GenerateAdjacency ) 최적화된 인접 정보를 보관할 DWORD배열을 만든후에 OptimizeInplace()함수를 사용하여 최적화 시키면 된다.

    참고로  D3DXMESHOPT_ATTRSORT 사용시 만들어지는 속성 테이블은 D3DXATTRIBUTERANGE 구조체의 배열로 만들어 지는데 이곳에는 서브셋ID, 현재의 서브셋과 연결된 삼각형들의 시작을 지정하는 인덱스 버퍼, 서브셋 내의 면의수, 현재 서브셋과 연결된 버텍스들의 시작을 지정하는 버텍스 버퍼, 서브셋 내의 버텍스의 수가 저장되어진다. 모두 DWORD 형이다.
    이 속성 테이블을 사용하면 간단한 검색만으로도 서브셋내의 모든 기하정보를 쉽게 찾을수 있는 장점을 얻게된다. GetAttributeTable을 이용하여 속성 테이블에 접근할수 있다.


Designed by Tistory.