DirectX Graphics 프로그래밍 가이드 고도의 주제 정점 파이프라인 지오메트리 혼합 지오메트리 혼합의 사용법   [목차열람] [주소복사] [슬롯비우기]
지오메트리 혼합의 사용법
 
Microsoft DirectX 9.0

지오메트리 혼합의 사용법


2 개의 행렬간에 블렌드 하는 정점에 다음의 사용자 정의 구조체를 사용한다.

// The flexible vertex format descriptor for this vertex would be:
//   FVF = D3DFVF_XYZB1 | D3DFVF_NORMAL | D3DFVF_TEX1; 

struct D3DBLENDVERTEX {
    D3DVECTOR v;
    FLOAT     blend; 
    D3DVECTOR n;
    FLOAT     tu, tv;
};

블렌드의 중량감은, 유연한 정점 포맷내의 위치 좌표 및 RHW 데이터의 뒤로, 한편 정점 법선의 전에 없으면 안 된다.

전의 정점 포맷에는, 혼합의 중량감이 1 개 밖에 없는 것에 주의한다. 이것은,D3DTS_WORLDMATRIX (0) 및 D3DTS_WORLDMATRIX(1) 변환 스테이트로 정의되는 2 개의 월드 행렬이 있기 때문에 있다. 이것들 2 개의 행렬간에 각각의 정점이, 1 개의 중량감을 사용해 블렌드 된다. 행렬이 3 개 있는 경우, 중량감은 2 개 필요하다.

  

스킨의 중량감은 간단하게 정의할 수 있다. Joint 하는 개체간의 거리의 선형 함수를 사용하면 좋지만, 보다 매끄러운 S 자 함수를 사용하면 게다가 좋다. 스킨의 중량감 분포 함수를 선택 하면, 필요에 따라서 간접부에 선명 없음원을 붙일 수가 있다 (짧은 거리간에 스킨의 중량감의 변화를 크게 한다).

혼합 행렬의 설정

IDirect3DDevice9::SetTransform 메서드를 호출해, 시스템이 블렌드 할 때의 변환 행렬을 설정한다. 제 1 인수에 D3DTS_WORLDMATRIX 매크로로 정의되는 값을 설정해, 제 2 인수에는 설정하는 행렬의 주소를 설정한다.

다음의 C++ 샘플 코드는, 2 개의 월드 행렬을 설정한다. 이러한 행렬간에 지오메트리를 블렌드 해 Joint 된 팔의 일루전을 생성 한다.

// For this example, the d3dDevice variable is assumed to be a valid pointer
//   to an IDirect3DDevice9 interface for an initialized 3-D scene.

float     BendAngle = 3.1415926f / 4.0f; // 45 degrees
D3DMATRIX matUpperArm, matLowerArm;

// The upper arm is immobile.Use the identity matrix.
D3DXMatrixIdentity( matUpperArm );
d3dDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matUpperArm );

// The lower arm rotates about the x-axis, attached to the upper arm.
D3DXMatrixRotationX( matLowerArm, -BendAngle ); 
d3dDevice->SetTransform( D3DTS_WORLDMATRIX(1), &matLowerArm );

혼합 행렬을 설정해도, 시스템은 그 행렬을 다음에 사용할 수 있도록(듯이) 단지 캐쉬하는 것만으로, 정점의 블렌드를 시작 하는 것은 아니다.

지오메트리 혼합을 유효하게 하는

디폴트에서는, 지오메트리 혼합은 무효이다. 지오메트리 혼합을 유효하게 하려면 ,IDirect3DDevice9::SetRenderState 메서드를 호출해 D3DRS_VERTEXBLEND 렌더링 스테이트를 D3DVERTEXBLENDFLAGS 열거형으로부터의 값으로 설정한다. 다음 코드는, 2 개의 월드 행렬간에서 블렌드하기 위한 , 렌더링 스테이트의 설정을 나타내고 있다.

d3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );

D3DRS_VERTEXBLEND 가 D3DVBF_DISABLE 이외의 값으로 설정되어 있는 경우는, 정점 포맷에 적절한 개수의 혼합의 중량감이 포함되어 있다고 가정한다. 적절한 정점 포맷을 생성 하는 것, 그 포맷의 올바른 기술을 Microsoft® Direct3D® 렌더링 메서드에 제공하는 것은 개발자의 책임이다.

지오메트리 혼합이 유효하게 되어 있는 경우, DrawPrimitive 렌더링 메서드로 렌더링 되는 모든 개체에 대해서 지오메트리 혼합이 실행된다.

참조

정점 포맷



© 2002 Microsoft Corporation. All rights reserved.
↑TOP