Download - Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

Transcript
Page 1: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

DirectX9 프로그래밍의 기초

Page 2: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

목 차

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

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

DirectX9에서의 그리기

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

애니메이션및 게임 실습 2

Page 3: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

DirectX 그래픽의 역사

DirectX 2.0

1995. DirectX

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

1996. Direct3D

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

애니메이션및 게임 실습 3

Page 4: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

DirectX 그래픽의 역사

DirectX 6/7

즉시 모드(Immediate Mode)

저수준 API저수준 API

유지 모드(Retained Mode)

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

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

애니메이션및 게임 실습 4

Page 5: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

DirectX 그래픽의 역사

DirectX 8

Direct Draw와 Direct3D의 통합

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

포인트 스프라이트

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

3D 텍스처

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

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

유틸리티 라이브러리

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

버텍스와 픽셀 셰이더

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

애니메이션및 게임 실습 5

Page 6: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

DirectX 그래픽의 역사

DirectX 9

HLSL(High-Level Shader Language)

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

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

애니메이션및 게임 실습 6

Page 7: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

HAL과 COM에 대한 개요

하드웨어 추상 계층(HAL)

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

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

Direct3D

GDI

HAL

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

GDI

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

그래픽 카드

애니메이션및 게임 실습 7

Page 8: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

HAL과 COM에 대한 개요

플러그블 소프트웨어 장치

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

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

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

디바이스 제어하기

애니메이션및 게임 실습 8

Page 9: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

Win32API 프로그래밍의 개요

New Projectsj

애니메이션및 게임 실습 9

Page 10: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

Win32API 프로그래밍의 개요

An empty projectp y p j

애니메이션및 게임 실습 10

Page 11: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

Win32API 프로그래밍의 개요

New Files – c++ source file

애니메이션및 게임 실습 11

Page 12: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

Win32API 프로그래밍의 개요

Project – Settings – Linkj g

d3d9.lib d3dx9.lib winmm.lib

애니메이션및 게임 실습 12

Page 13: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

Win32API 프로그래밍의 개요

Tools – Options – Directories – Include filesp

애니메이션및 게임 실습 13

Page 14: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

Win32API 프로그래밍의 개요

Tools – Options – Directories – Library filesp y

애니메이션및 게임 실습 14

Page 15: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

Direct3D 초기화

예제 1

애니메이션및 게임 실습 15

Page 16: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

용어 및 기본 함수 정리

표면(surface)

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

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

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

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

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

애니메이션및 게임 실습 16

Page 17: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

용어 및 기본 함수 정리

멀티 샘플링(Multisampling)p g

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

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

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

애니메이션및 게임 실습 17

Page 18: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

용어 및 기본 함수 정리

픽셀 포맷

D3DFMT_R8G8B8 : 24bit 포맷

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

D3DFMT_A8R8G8B8 : 32bit 포맷

D3DFMT_X16B16G16R16F : 64bit 포맷

D3DFMT_A32B32G32R32F : 128bit 포맷

애니메이션및 게임 실습 18

Page 19: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

용어 및 기본 함수 정리

메모리 풀

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

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

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

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

애니메이션및 게임 실습 19

Page 20: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

용어 및 기본 함수 정리

스왑 체인

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

스왑 체인과 플리핑 기술

표면 1 표면 2

표면 1 표면 2

전면버퍼 후면버퍼

표면 1

전면버퍼

표면 2

후면버퍼

표면 2

전면버퍼

표면 1

후면버퍼

표면 1

전면버퍼

표면 2

후면버퍼

애니메이션및 게임 실습 20

Page 21: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

용어 및 기본 함수 정리

깊이 버퍼(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

Page 22: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

Direct3D 초기화

초기화 과정

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

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

D3DPRESENT_PARAMETERS 구조체 인스턴스 초기화

IDirect3DDevice9 생성

애니메이션및 게임 실습 22

Page 23: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

Direct3D 초기화

예제 1

d3dUtility.h

d3dUtility cppd3dUtility.cpp

d3dInit.cpp

애니메이션및 게임 실습 23

Page 24: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

Page 25: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

정점(vertex) 포맷

Flexible Vertex Format (FVF)

x, y, z 좌표

변환정점변환정점

블렌딩 가중치

법선 벡터

정점 포인트 크기

분산반사 색상

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

텍스처좌표 1-8

애니메이션및 게임 실습 25

Page 26: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

정점(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

Page 27: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

삼각형의 정의

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

v1 v2

삼각형0

삼각형1

v0 v3

애니메이션및 게임 실습 27

Page 28: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

인덱스

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

Page 29: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

정점 버퍼

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

인덱스 버퍼

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

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

비디오 메모리에 저장 가능

애니메이션및 게임 실습 29

Page 30: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

버퍼 만들기

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);

Page 31: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

버퍼 메모리에 접근하기

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

Page 32: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

캡슐화

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

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

D3DRS_ZENABLE, ALPHATESTENABLE, LIGHITING, …

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

)

_device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

애니메이션및 게임 실습 32

Page 33: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

스트림 소스 지정

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

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

Page 34: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

정점 포맷 지정

_device->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)

인덱스 버퍼 지정

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

애니메이션및 게임 실습 34

Page 35: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

정점 버퍼를 이용한 그리기

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

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

))

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

애니메이션및 게임 실습 35

Page 36: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

인덱스를 이용한 그리기

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

Page 37: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

인덱스를 이용한 그리기

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

Page 38: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

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

예제

애니메이션및 게임 실습 38

Page 39: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

D3DX 기하 물체

메쉬 생성 함수

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

D3DXCreateBoxD3DXCreateBoxD3DXCreateSphereD3DXCreateCylinderD3DXCreateTeapotD3DXCreatePolygonD3DXCreateTorus

애니메이션및 게임 실습 39

Page 40: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

D3DX 기하 물체

예제 : Box

애니메이션및 게임 실습 40

Page 41: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

D3DX 기하 물체

예제 : Teapotp

애니메이션및 게임 실습 41

Page 42: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

D3DX 기하 물체

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

애니메이션및 게임 실습 42

Page 43: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

메쉬(Mesh)

정의

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

필요성필요성

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

구성

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

애니메이션및 게임 실습 43

Page 44: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

기하정보

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

Page 45: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

기하정보

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

Page 46: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

서브셋과 속성 버퍼

서브셋

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

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

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

서브셋 내의 삼각형

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

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

애니메이션및 게임 실습 46

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

Page 47: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

서브셋과 속성 버퍼

속성 버퍼

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

0 1 n…속성 버퍼

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

0 1 2 0 2 3…

20 22 23

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

인덱스 버퍼

애니메이션및 게임 실습 47

Page 48: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

서브셋과 속성 버퍼

속성 버퍼

잠금/해제

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

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

애니메이션및 게임 실습 48

Page 49: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

드로잉

DrawSubset()

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

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

for(int i=0;i<numSubsets;i++){{

Device->SetMaterial(mtrls[i]);Device->SetTexture(0, textures[i]);Mesh->DrawSubset(i);

}}

애니메이션및 게임 실습 49

Page 50: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

최적화

메쉬 최적화

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

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

);

애니메이션및 게임 실습 50

Page 51: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

최적화

메쉬 최적화

Fl 설명Flags 설명

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

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

D3DXMESHOPT_VERTEXCACHE 정점 캐시의 히트율 향상

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

D3DXMESHOPT_STRIPREORDER구성

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

애니메이션및 게임 실습 51

Page 52: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

최적화

메쉬 최적화 사용 예

// 최적화되지 않은 메쉬의 인접 정보 획득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

);

Page 53: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

최적화

Optimizep

최적화된 메쉬 반환

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

))

애니메이션및 게임 실습 53

Page 54: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

속성 테이블

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

Page 55: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

속성 테이블

속성 테이블

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

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

} D3DXATTRIBUTERANGE;

애니메이션및 게임 실습 55

Page 56: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

속성 테이블

속성 테이블의 접근

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

Page 57: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

근접 정보

인접 정보

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

Tri : 2Tri : 0

-1Tri : 1

0Tri : 2

-1

Tri : 0Tri : 1

-11

-12

-11

애니메이션및 게임 실습 57

Page 58: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

근접 정보

인접 정보의 생성

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

Page 59: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

복제

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 동적생성

Page 60: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

메쉬 만들기

빈 메쉬 만들기

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

);

애니메이션및 게임 실습 60

Page 61: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

메쉬 만들기

빈 메쉬 만들기

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

);

애니메이션및 게임 실습 61

Page 62: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

메쉬 만들기

순서

빈 메쉬 만들기

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

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

메쉬의 인접 정보 만들기

메쉬 최적화

메쉬 그리기

애니메이션및 게임 실습 62

Page 63: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

메쉬 만들기

예제

애니메이션및 게임 실습 63

Page 64: Week03 DirectX9 프로그래밍의 기초cfs8.tistory.com/upload_control/download.blog?fhandle... · 2015. 1. 22. · Di tX9DirectX9 프로그래밍의기초 DirectX 그래픽의역사

Question?Question?Question?Question?

애니메이션및 게임 실습 64


Top Related