Week03 DirectX9 프로그래밍의...

of 64/64
DirectX9 프로그래밍의 기초
  • date post

    14-Sep-2020
  • Category

    Documents

  • view

    4
  • download

    3

Embed Size (px)

Transcript of Week03 DirectX9 프로그래밍의...

  • DirectX9 프로그래밍의 기초

  • 목 차

    Di tX9 프로그래밍의 기초DirectX9 프로그래밍의 기초

    DirectX 그래픽의 역사HAL과 COM에 대한 개요HAL과 COM에 대한 개요

    DirectX9에서의 그리기

    Win32API 프로그래밍의 개요Direct3D 초기화정점/인덱스 버퍼를 이용한 그리기D3DX 기하 물체D3DX 기하 물체메쉬의 이용

    애니메이션및 게임 실습 2

  • DirectX 그래픽의 역사

    DirectX 2.0

    1995. DirectX

    Windows 드라이버 제공Windows 드라이버 제공DirectX API + Reality Lab(RenderMorphics) + 3D-DDI(Michael Abrash)

    1996. Direct3D

    3D 가속 하드웨어의 향상된 그래픽 능력 사용각 하드웨어에 대한 공통 인터페이스 지원장치 독립적이고 추상화된 접근 가능장치 독립적이고 추상화된 접근 가능

    애니메이션및 게임 실습 3

  • DirectX 그래픽의 역사

    DirectX 6/7

    즉시 모드(Immediate Mode)

    저수준 API저수준 API

    유지 모드(Retained Mode)

    즉시 모드 기반프레임 계층 구조 및 애니메이션 기능 제공

    하드웨어 가속변환 조명 광원의 재조정 뷰포트 객체의 지원하드웨어 가속변환, 조명, 광원의 재조정, 뷰포트 객체의 지원텍스처 사용의 용이성 제공

    애니메이션및 게임 실습 4

  • DirectX 그래픽의 역사

    DirectX 8

    Direct Draw와 Direct3D의 통합

    데이터의 초기화, 할당, 관리의 단순화

    포인트 스프라이트

    하드웨어 스프라이트 사용 가능 : 스파크, 폭발, 비

    3D 텍스처

    3D 볼륨을 가지는 텍스처 사용

    정확한 픽셀단위 조명 효과, 포인트 광원, 스포트 광원, 대기 환경 효과 지원

    유틸리티 라이브러리

    벡터 및 행렬 연산, 이미지 파일 읽기 및 텍스처 생성 단순화

    버텍스와 픽셀 셰이더

    어셈블리를 이용한 하드웨어 제어

    애니메이션및 게임 실습 5

  • DirectX 그래픽의 역사

    DirectX 9

    HLSL(High-Level Shader Language)

    C 언어와 유사한 문법 NDIVIA와 공동 개발C 언어와 유사한 문법, NDIVIA와 공동 개발

    Scissor Test, Line Anti-Aliasing텍스처 좌표 자동 생성 지원양면 구조의 스텐실 지원다중 렌더링 지원

    애니메이션및 게임 실습 6

  • HAL과 COM에 대한 개요

    하드웨어 추상 계층(HAL)

    Hardware Abstraction Layer하드웨어와 Direct3D의 중간 매개체

    애플리케이션 애플리케이션

    Direct3D

    GDI

    HAL

    디바이스 드라이버 인터페이스

    GDI

    디바이스 드라이버 인터페이스

    그래픽 카드

    애니메이션및 게임 실습 7

  • HAL과 COM에 대한 개요

    플러그블 소프트웨어 장치

    하드웨어 에뮬레이션 계층 : 하드웨어가 3D 기능을 제공하지 않는 경우

    레퍼런 래 터라이저레퍼런스 래스터라이저

    DirectX SDK에서만 제공하드웨어 미지원 기능 테스트하드웨어 미지원 기능 테스트

    디바이스 제어하기

    애니메이션및 게임 실습 8

  • Win32API 프로그래밍의 개요

    New Projectsj

    애니메이션및 게임 실습 9

  • Win32API 프로그래밍의 개요

    An empty projectp y p j

    애니메이션및 게임 실습 10

  • Win32API 프로그래밍의 개요

    New Files – c++ source file

    애니메이션및 게임 실습 11

  • Win32API 프로그래밍의 개요

    Project – Settings – Linkj g

    d3d9.lib d3dx9.lib winmm.lib

    애니메이션및 게임 실습 12

  • Win32API 프로그래밍의 개요

    Tools – Options – Directories – Include filesp

    애니메이션및 게임 실습 13

  • Win32API 프로그래밍의 개요

    Tools – Options – Directories – Library filesp y

    애니메이션및 게임 실습 14

  • Direct3D 초기화

    예제 1

    애니메이션및 게임 실습 15

  • 용어 및 기본 함수 정리

    표면(surface)

    Direct3D가 주로 2D 이미지 데이터를 보관하는 데 이용하는 픽셀의 행렬

    IDirect3DSurface9 인터페이스 이용IDirect3DSurface9 인터페이스 이용

    LockRect : 표면 메모리로의 포인터 제공

    UnlockRect : LockRect를 호출하고 표면 메모리에 대한 작업이 끝난 뒤에는이 메서드를 호출하여 표면의 잠금 해제

    GetDesc : 표면에 대한 정보를 D3DSURFACE DESC 구조체를 통해 획득GetDesc : 표면에 대한 정보를 D3DSURFACE_DESC 구조체를 통해 획득

    애니메이션및 게임 실습 16

  • 용어 및 기본 함수 정리

    멀티 샘플링(Multisampling)p g

    픽셀로 이미지를 표현할 때 나타나는 거친 이미지를 부드럽게 만드는 기술안티알리아싱

    D3DMULTISAMPLE_TYPE : 표면에 적용할 멀티 샘플링 레벨 지정

    D3DMULTISAMPLE_NONE : 멀티 샘플링 미지정D3DMULTISAMPLE_1_SAMPLE ~ D3DMULTISAMPLE_16_SAMPLE : 1 ~ 16 멀티 샘플링 레벨 지정

    애니메이션및 게임 실습 17

  • 용어 및 기본 함수 정리

    픽셀 포맷

    D3DFMT_R8G8B8 : 24bit 포맷

    D3DFMT X8R8G8B8 : 32bit 포맷D3DFMT_X8R8G8B8 : 32bit 포맷

    D3DFMT_A8R8G8B8 : 32bit 포맷

    D3DFMT_X16B16G16R16F : 64bit 포맷

    D3DFMT_A32B32G32R32F : 128bit 포맷

    애니메이션및 게임 실습 18

  • 용어 및 기본 함수 정리

    메모리 풀

    D3DPOOL_DEFAULT자원의 타입과 이용 방식에 가장 적합한 자원들을 메모리에 보관하도록Direct3D에 요청 (비디오 메모리 AGP 메모리 시스템 메모리)Direct3D에 요청, (비디오 메모리, AGP 메모리, 시스템 메모리)

    D3DPOOL_MANAGED관리 풀에 보관된 자원은 Direct3D에 의해 관리. 즉, 필요에 따라 자동으로 비디오 메모리나 AGP 메모리로 이전, 부가적으로 자원의 백업 복사본이 시스템메모리 내에 보관

    D3DPOOL SYSTEMMEMD3DPOOL_SYSTEMMEM시스템 메모리 내에 보관될 자원 지정

    D3DPOOL_SCRATCH시스템 메모리 내에 보관될 자원 지정장치는 이 풀 내의 자원에 직접 접근 불가능, 그러나 자원을 두 풀 사이에 서로 복사하는 것은 가능

    애니메이션및 게임 실습 19

  • 용어 및 기본 함수 정리

    스왑 체인

    Direct3D는 2, 3개의 표면을 하나의 컬렉션으로 관리IDirect3DSwapChain9 인터페이스

    스왑 체인과 플리핑 기술

    표면 1 표면 2

    표면 1 표면 2

    전면버퍼 후면버퍼

    표면 1

    전면버퍼

    표면 2

    후면버퍼

    표면 2

    전면버퍼

    표면 1

    후면버퍼

    표면 1

    전면버퍼

    표면 2

    후면버퍼

    애니메이션및 게임 실습 20

  • 용어 및 기본 함수 정리

    깊이 버퍼(Depth buffer)p

    특정 픽셀의 깊이 정보 저장해상도가 640X480이면, 깊이 버퍼의 크기도 640X480의 크기를 가짐

    깊이 버퍼링 혹은 z-버퍼링에 이용

    D3DFMT_D32 : 32비트 깊이 버퍼 지장D3DFMT_D24S8 : 24비트 깊이 버퍼, 8비트 스텐실 버퍼 지정D3DFMT_D24X8 : 24비트 깊이 버퍼 지장D3DFMT_D24X4S4 : 24비트 깊이 버퍼, 4비트 스텐실 버퍼 지정D3DFMT D16 : 16비트 깊이 버퍼 지정D3DFMT_D16 : 16비트 깊이 버퍼 지정

    애니메이션및 게임 실습 21

  • Direct3D 초기화

    초기화 과정

    IDirect3D9 인터페이스의 포인터 획득

    기본 디스플레이 어댑터(기본 그래픽 카드)의 하드웨어 버텍스 프로세싱 지원여부기본 디스플레이 어댑터(기본 그래픽 카드)의 하드웨어 버텍스 프로세싱 지원여부확인

    D3DPRESENT_PARAMETERS 구조체 인스턴스 초기화

    IDirect3DDevice9 생성

    애니메이션및 게임 실습 22

  • Direct3D 초기화

    예제 1

    d3dUtility.h

    d3dUtility cppd3dUtility.cpp

    d3dInit.cpp

    애니메이션및 게임 실습 23

  • Direct3D 초기화

    초기화 함수

    HRESULT IDirect3DDevice9::Clear(

    // 배열 내 사각형의 수DWORD Count, // pRects 배열 내 사각형의 수const D3DRECT* pRects, // 소거하려는 화면 사각형의 배열DWORD Flags, // 어떤 표면을 소거할 지 지정D3DCOLOR Color // 렌더 대상을 소거할 색상D3DCOLOR Color, // 렌더 대상을 소거할 색상float Z, // 깊이 버퍼 지정값DWORD Stencil // 스텐실 버퍼 지정값

    )

    Flags

    D3DCLEAR TARGET : 렌더 대상 표면, 보통은 후면 버퍼D3DCLEAR_TARGET 렌더 대상 표면, 보통은 후면 버퍼D3DCLEAR_ZBUFFER : 깊이 버퍼D3DCLEAR_STENCIL : 스텐실 버퍼

    애니메이션및 게임 실습 24

  • 정점/인덱스 버퍼를 이용한 그리기

    정점(vertex) 포맷

    Flexible Vertex Format (FVF)

    x, y, z 좌표

    변환정점변환정점

    블렌딩 가중치

    법선 벡터

    정점 포인트 크기

    분산반사 색상

    반영반사 색상반영반사 색상

    텍스처좌표 1-8

    애니메이션및 게임 실습 25

  • 정점/인덱스 버퍼를 이용한 그리기

    정점(vertex) 포맷

    struct ColorVertex{float x y z; // 위치float _x, _y, _z; // 위치DWORD _color; // 색상}

    #define FVF_COLOR (D3DFVF_XYZ | D3DFVF_DIFFUSE)

    struct NormalTexVertex{{float _x, _y, _z; // 위치float _nx, _ny, _nz; // 법선 벡터float _u, _v; // 텍스처 좌표}

    #define FVF_COLOR (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)

    애니메이션및 게임 실습 26

  • 정점/인덱스 버퍼를 이용한 그리기

    삼각형의 정의

    Vertex rect[6] = {v0, v1, v2, // 삼각형 0v0, v2, v3}; // 삼각형 1

    v1 v2

    삼각형0

    삼각형1

    v0 v3

    애니메이션및 게임 실습 27

  • 정점/인덱스 버퍼를 이용한 그리기

    인덱스

    Vertex vertexList [4] = {v0, v1, v2, v3};WORD indexList [6] = {0, 1, 2,

    0 2 3};0, 2, 3};

    v1 v2

    삼각형0

    삼각형1

    v0 v3

    애니메이션및 게임 실습 28

  • 정점/인덱스 버퍼를 이용한 그리기

    정점 버퍼

    정점 데이터를 보관하는 연속적인 메모리 덩어리IDirect3DVertexBuffer9

    인덱스 버퍼

    인덱스 데이터를 보관하는 연속적인 메모리 덩어리인덱스 데이터를 보관하는 연속적인 메모리 덩어리IDirect3DIndexBuffer9

    버퍼 사용 이유버퍼 사용 이유

    비디오 메모리에 저장 가능

    애니메이션및 게임 실습 29

  • 정점/인덱스 버퍼를 이용한 그리기

    버퍼 만들기

    HRESULT IDirect3DDevice9::CreateVertexBuffer(UINT Length, // 버퍼에 할당할 바이트 수g ,DWORD Usage, // 버퍼가 이용되는 방법DWORD FVF, // 유연한 정점 포맷D3DPOOL Pool, // 버퍼가 위치할 메모리 풀IDi t3DV t B ff 9** V t B ff // 정점 버퍼를 받을 포인터IDirect3DVertexBuffer9** ppVertexBuffer, // 정점 버퍼를 받을 포인터HANDLE* pSharedHandle // 0

    );

    HRESULT IDirect3DDevice9::CreateIndexBuffer(UINT Length,DWORD Usage,DWORD F // 인덱스의 크기 지정(D3DFMT INDEX16 32)DWORD Format, // 인덱스의 크기 지정(D3DFMT_INDEX16, 32)D3DPOOL Pool,IDirect3DIndexBuffer9** ppVertexBuffer,HANDLE* pSharedHandle

    애니메이션및 게임 실습 30

    pS);

  • 정점/인덱스 버퍼를 이용한 그리기

    버퍼 메모리에 접근하기

    HRESULT IDirect3DVertexBuffer9::Lock(UINT OffsetToLock, // 잠금을 시작할 버퍼 위치,UINT SizeToLock, // 잠글 바이트의 수BYTE** ppbData, // 잠근 메모리의 시작을 가리키는 포인터DWORD Flags // 잠금 방법

    ););HRESULT IDirect3DIndexBuffer9::Lock(

    UINT OffsetToLock,UINT SizeToLock,UINT SizeToLock,BYTE** ppbData,DWORD Flags

    );

    버퍼 메모리

    애니메이션및 게임 실습 31

    OffsetToLock

    SizeToLock

    OffsetToLock + SizeToLock

  • 정점/인덱스 버퍼를 이용한 그리기

    캡슐화

    렌더링되는 방식을 결정하는 다양한 렌더링 상태를 캡슐화

    렌더 상태 변경 함렌더 상태 변경 함수

    D3DRS_ZENABLE, ALPHATESTENABLE, LIGHITING, …

    HRESULT IDirect3DDevice9::SetRenderState(HRESULT IDirect3DDevice9::SetRenderState(D3DRENDERSTATETYPE State, // 변경할 상태DWORD value // 새로운 상태 값

    )

    _device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

    애니메이션및 게임 실습 32

  • 정점/인덱스 버퍼를 이용한 그리기

    스트림 소스 지정

    스트림 소스를 정점 버퍼와 연결하여 버퍼의 기하정보를 렌더링 파이프라인에 보냄

    HRESULT IDirect3DDevice9::SetStreamSource(UINT StreamNumber, // 스트림소스 지정IDIRECT3DVertexBuffer9* pStreamData, // 정점 버퍼 포인터UINT OffsetInBytes // 시작 오프셋UINT OffsetInBytes, // 시작 오프셋UINT Stride // 바이트 수

    )

    d i S S S ( 0 b 0 i f( ) )_device->SetStreamSource( 0, vb, 0, sizeof(VERTEX) );

    애니메이션및 게임 실습 33

  • 정점/인덱스 버퍼를 이용한 그리기

    정점 포맷 지정

    _device->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)

    인덱스 버퍼 지정

    device->SetIndices(ib);_device >SetIndices(ib);

    애니메이션및 게임 실습 34

  • 정점/인덱스 버퍼를 이용한 그리기

    정점 버퍼를 이용한 그리기

    기하 정보를 렌더링 파이프라인으로 보내는 실질적인 드로잉 과정 수행

    HRESULT IDirect3DDevice9::DrawPrimitive(D3DPRIMITIVETYPE P i i i T // 기본형 타입D3DPRIMITIVETYPE PrimitiveType, // 기본형 타입UINT StartVertex, // 읽기 시작할 정점 스트림UINT PrimitiveCount // 기본형의 수

    ))

    _device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 4);

    애니메이션및 게임 실습 35

  • 정점/인덱스 버퍼를 이용한 그리기

    인덱스를 이용한 그리기

    typedef enum _D3DPRIMITIVETYPE {yp _ {D3DPT_POINTLIST = 1,D3DPT_LINELIST = 2,D3DPT_LINESTRIP = 3,D3DPT TRIANGLELIST = 4D3DPT_TRIANGLELIST = 4,D3DPT_TRIANGLESTRIP = 5,D3DPT_TRIANGLEFAN = 6,D3DPT_FORCE_DWORD = 0x7fffffff

    } D3DPRIMITIVETYPE;

    애니메이션및 게임 실습 36

  • 정점/인덱스 버퍼를 이용한 드로잉

    인덱스를 이용한 그리기

    HRESULT IDirect3DDevice9::DrawIndexedPrimitive(D3DPRIMITIVETYPE P i i i T // 기본형 타입D3DPRIMITIVETYPE PrimitiveType, // 기본형 타입INT BaseVertexIndex, // 호출될 기반 번호UINT MinIndex, // 참조할 최소 인덱스값UINT NumVertices, // 정점의 수, 정점의 수UINT StartIndex, // 인덱스 버퍼내의 시작점UINT PrimitiveCount // 기본형의 수

    )

    _device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12);

    애니메이션및 게임 실습 37

  • 정점/인덱스 버퍼를 이용한 드로잉

    예제

    애니메이션및 게임 실습 38

  • D3DX 기하 물체

    메쉬 생성 함수

    D3DX 라이브러리에서 지원하는 함수

    D3DXCreateBoxD3DXCreateBoxD3DXCreateSphereD3DXCreateCylinderD3DXCreateTeapotD3DXCreatePolygonD3DXCreateTorus

    애니메이션및 게임 실습 39

  • D3DX 기하 물체

    예제 : Box

    애니메이션및 게임 실습 40

  • D3DX 기하 물체

    예제 : Teapotp

    애니메이션및 게임 실습 41

  • D3DX 기하 물체

    예제 : Sphere, Cylinder, Torus, Teapot, Boxp y p

    애니메이션및 게임 실습 42

  • 메쉬(Mesh)

    정의

    정점 및 삼각형들의 모음 + 텍스처

    필요성필요성

    정점 및 삼각형들을 하나의 객체로 묶을 수 있음다양한 객체들의 효율적 관리 용이다양한 객체들의 효율적 관리 용이

    구성

    장면을 구성하는 객체객체들 사이의 관계

    애니메이션및 게임 실습 43

  • 기하정보

    ID3DXBaseMesh

    정점 버퍼와 인덱스 버퍼

    HRESULT ID3DXMesh::GetVertexBuffer(LPDIRECT3DVERTEXBUFFER9* ppVB);

    버퍼의 사용

    HRESULT ID3DXMesh::GetVertexBuffer(LPDIRECT3DVERTEXBUFFER9 ppVB);HRESULT ID3DXMesh::GetIndexBuffer(LPDIRECT3DINDEXBUFFER9* ppIB);

    IDirect3DVertexBuffer9* vb = 0;Mesh->GetVertexBuffer(&vb);

    IDirect3DIndexBuffer9* ib = 0;Mesh->GetIndexBuffer(&ib);

    애니메이션및 게임 실습 44

  • 기하정보

    ID3DXBaseMesh

    버퍼의 잠금/해제

    HRESULT ID3DXMesh::LockVertexBuffer(LPDIRECT3DVERTEXBUFFER9* ppVB);SU 3 es :: oc Ve te u e ( C 3 V U 9 ppV );HRESULT ID3DXMesh::LockIndexBuffer(LPDIRECT3DINDEXBUFFER9* ppIB);

    HRESULT ID3DXMesh::UnLockVertexBuffer();HRESULT ID3DXM h U L kI d B ff ()

    부가적인 기하 관련 정보

    HRESULT ID3DXMesh::UnLockIndexBuffer();

    DWORD GetFVF() : 정점의 정점 포맷 리턴DWORD GetNumVertices() : 정점 버퍼내의 정점의 수 리턴DWORD GetNumBytesPerVertex() : 정점당 바이트 수 리턴DWORD GetNumFaces() : 메쉬 내의 삼각형의 수 리턴

    애니메이션및 게임 실습 45

  • 서브셋과 속성 버퍼

    서브셋

    동일한 속성을 이용해 렌더링할 수 있는 메쉬 내 삼각형의 그룹속성 : 재질, 텍스처, 렌더 상태

    서브셋 2 : 천정천정 속성을 이용해서브셋 내의 삼각형

    서브셋 1 : 벽벽 속성을 이용해

    서브셋 내의 삼각형

    서브셋 3 : 창문창문 속성을 이용해서브셋 내의 삼각형

    서브셋 0 : 바닥바닥 속성을 이용해서브셋 내의 삼각형

    애니메이션및 게임 실습 46

    들을 렌더링한다.들을 렌더링한다. 들을 렌더링한다.들을 렌더링한다.

  • 서브셋과 속성 버퍼

    속성 버퍼

    속성 ID : DWORD속성 버퍼내의 항목 : 인덱스 버퍼에 정의된 삼각형

    0 1 n…속성 버퍼

    삼각형0 삼각형1 삼각형n

    0 1 2 0 2 3…

    20 22 23

    삼각형0 삼각형1 삼각형n

    인덱스 버퍼

    애니메이션및 게임 실습 47

  • 서브셋과 속성 버퍼

    속성 버퍼

    잠금/해제

    DWORD* buffer = 0;Mesh->LockAttributeBuffer(lockingFlags, &buffer);

    Mesh->UnlockAttributeBuffer();Mesh->UnlockAttributeBuffer();

    애니메이션및 게임 실습 48

  • 드로잉

    DrawSubset()

    속성 ID로 지정한 특정 서브셋의 삼각형 그리기

    M h D S b (0)Mesh->DrawSubset(0);

    for(int i=0;iSetMaterial(mtrls[i]);Device->SetTexture(0, textures[i]);Mesh->DrawSubset(i);

    }}

    애니메이션및 게임 실습 49

  • 최적화

    메쉬 최적화

    효과적인 메쉬 렌더링을 위해서 점과 인덱스 재구성

    HRESULT ID3DXMesh::OptimizeInplace(DWORD Flags, // 최적화 플래그CONST DWORD* pAdjacencyIn, // 최적화전 인접 정보DWORD* pAdjacencyOut // 최적화후 인접정보DWORD pAdjacencyOut, // 최적화후 인접정보DWORD* pFaceRemap, // 면 리맵 정보LPD3DXBUFFER* ppVertexRemap // 정점 리맵 정보

    );

    애니메이션및 게임 실습 50

  • 최적화

    메쉬 최적화

    Fl 설명Flags 설명

    D3DXMESHOPT_COMPACT 이용하지 않는 정점과 인덱스 제거

    D3DXMESHOPT_ATTRSORT속성으로 삼각형 정렬, 속성 테이블 생성효율 증대

    D3DXMESHOPT_VERTEXCACHE 정점 캐시의 히트율 향상

    D3DXMESHOPT STRIPREORDER삼각형 스트립이 가능한 길어지도록 인덱스 재구성

    D3DXMESHOPT_STRIPREORDER구성

    D3DXMESHOPT_IGNOREVERTS 정점을 무시하고 인덱스 정보만을 최적화

    애니메이션및 게임 실습 51

  • 최적화

    메쉬 최적화 사용 예

    // 최적화되지 않은 메쉬의 인접 정보 획득DWORD adjacencyInfo[Mesh->GetNumFaces()*3];DWORD adjacencyInfo[Mesh->GetNumFaces() 3];Mesh->GenerateAdjacency(0.0f, adjacencyInfo);

    // 최적화된 인접 정보를 보관할 배열DWORD optimizedAdjacencyInfo[Mesh->GetNumFaces()*3];

    Mesh->OptimizeInplace(D3DXMESHOPT ATTRSORT |D3DXMESHOPT_ATTRSORT |D3DXMESHOPT_COMPACT |D3DXMESHOPT_VERTEXCACHE,adjacencyInfo,optimizedAdjacencyInfo,0,0

    );

    애니메이션및 게임 실습 52

    );

  • 최적화

    Optimizep

    최적화된 메쉬 반환

    HRESULT ID3DXMesh::Optimize(HRESULT ID3DXMesh::Optimize(DWORD Flags,CONST DWORD* pAdjacencyIn,DWORD* pAdjacencyOut,DWORD* pFaceRemap,LPD3DXBUFFER* ppVertexRemap,LPD3DXMESH* ppOptMesh

    ))

    애니메이션및 게임 실습 53

  • 속성 테이블

    D3DXMESHOPT_ATTRSORT

    메쉬 기하정보가 속성에 따라 정렬정점 버퍼 및 인덱스 버퍼내에 있는 특정 부분의 기하 정보가 연속된 블록에 위치속성 테이블 생성속성 테이블 생성

    삼각형0 삼각형0 삼각형0

    속성 버퍼 0 0 0 1 1 1 1 1 2 2

    Tri : 0 Tri : 1 Tri : 2 Tri : 3 Tri : 4 Tri : 5 Tri : 6 Tri : 7 Tri : 8 Tri : 9인덱스 버퍼

    애니메이션및 게임 실습 54

  • 속성 테이블

    속성 테이블

    D3DXATTRIBUTERANGE 구조체테이블의 각 항목은 메쉬의 각 서브셋과 대응서브셋의 기하정보들의 보관되는 정점/인덱스 버퍼 내의 메모리 블록 지정서브셋의 기하정보들의 보관되는 정점/인덱스 버퍼 내의 메모리 블록 지정

    typedef struct _D3DATTRIBUTERANGE {DWORD AttribId; // 서브셋 IDDWORD AttribId; // 서브셋 IDDWORD FaceStart; // 현재 서브셋의 인덱스 버퍼 오프셋DWORD FaceCount; // 삼각형의 수DWORD VertexStart; // 현재 서브셋의 정점 버퍼 오프셋DWORD VertexCount; // 서브셋 내의 정점의 수

    } D3DXATTRIBUTERANGE;

    애니메이션및 게임 실습 55

  • 속성 테이블

    속성 테이블의 접근

    HRESULT ID3DMesh::GetAttributeTable(D3DXATTRIBUTERANGE* pAttribTable,DWORD* pAttribTableSize

    속성 테이블 내의 속성의 수 반환

    DWORD* pAttribTableSize)

    DWORD numSubsets = 0;Mesh->GetAttributeTable(0, &numSubsets);

    속성 데이터로 구조체의 배열 채우기

    D3DXATTRIBUTERANGE table = new D3DXATTRIBUTERANGE[numSubsets];M h G tAtt ib t T bl (t bl & S b t )Mesh->GetAttributeTable(table, &numSubsets);

    애니메이션및 게임 실습 56

  • 근접 정보

    인접 정보

    주어진 삼각형과 인접한 다른 삼각형에 대한 정보

    Tri : 2Tri : 0

    -1Tri : 1

    0Tri : 2

    -1

    Tri : 0Tri : 1

    -11

    -12

    -11

    애니메이션및 게임 실습 57

  • 근접 정보

    인접 정보의 생성

    HRESULT ID3DXMesh::GenerateAdjacency(FLOAT fE il // 유사도 거리 근사값FLOAT fEpsilon, // 유사도 : 거리 근사값DWORD* pAdjacency // 인접정보 포인터

    )

    DWORD adjacencyInfo[Mesh->GetNumFaces()*3];Mesh->GenerateAdjacency(0.001f, adjacencyInfo);j y( , j y );

    애니메이션및 게임 실습 58

  • 복제

    CloneMeshFVF

    HRESULT ID3DXMesh::CloneMeshFVF(DWORD Options, // 플래그DWORD Options, // 플래DWORD FVF, // 유연한 정점 포맷LPDIRECT3DDEVICE9 pDevice, // 복제된 메쉬와 연계될 장치LPD3DXMESH* ppCloneMesh // 복제된 메쉬

    ))

    설명Options 설명

    D3DXMESH_32BIT 32비트인덱스이용

    D3DXMESH MANAGED 관리메모리풀내에보관D3DXMESH_MANAGED 관리메모리풀내에보관

    D3DXMESH_WRITEONLY 쓰기전용

    D3DXMESH DYNAMIC 동적생성

    애니메이션및 게임 실습 59

    D3DXMESH_DYNAMIC 동적생성

  • 메쉬 만들기

    빈 메쉬 만들기

    HRESULT D3DXCreateMeshFVF(DWORD NumFaces, // 면의 수DWORD NumVertices, // 정점의 수DWORD Options, // 플래그DWORD FVF // 유연한 정점 포맷DWORD FVF, // 유연한 정점 포맷LPDIRECT3DDEVICE9 pDevice, // 생성할 메쉬와 연계될 장치LPD3DXMESH* ppMesh // 생성된 메쉬

    );

    애니메이션및 게임 실습 60

  • 메쉬 만들기

    빈 메쉬 만들기

    HRESULT D3DXCreateMesh(DWORD NumFaces, // 면의 수DWORD NumVertices, // 정점의 수DWORD Options, // 플래그CONST LPD3DVERTEXELEMENT9* pDeclaration // 정점 포맷CONST LPD3DVERTEXELEMENT9 pDeclaration, // 정점 포맷LPDIRECT3DDEVICE9 pDevice, // 생성할 메쉬와 연계될 장치LPD3DXMESH* ppMesh // 생성된 메쉬

    );

    애니메이션및 게임 실습 61

  • 메쉬 만들기

    순서

    빈 메쉬 만들기

    상자의 기하정보로 메쉬 채우기상자의 기하정보로 메쉬 채우기

    메쉬의 각 면이 존재하는 서브셋 지정

    메쉬의 인접 정보 만들기

    메쉬 최적화

    메쉬 그리기

    애니메이션및 게임 실습 62

  • 메쉬 만들기

    예제

    애니메이션및 게임 실습 63

  • Question?Question?Question?Question?

    애니메이션및 게임 실습 64