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

인덱스 첨부 정점 혼합의 사용법


256 ~ 511 의 범위의 변환 스테이트는, 8 비트의 인덱스를 사용해 인덱스 붙이고 할 수 있는 최대 256 개의 행렬을 저장 하기 위해서 확보되고 있다. D3DTS_WORLDMATRIX 매크로를 사용해, 인덱스 0 ~ 255 를 대응하는 변환 스테이트에 맵핑 한다. 다음 샘플 코드는,IDirect3DDevice9::SetTransform 메서드를 사용해 변환 스테이트 번호 256 의 행렬을 단위행렬로 설정하는 방법을 나타내고 있다.

D3DMATRIX matBlend1;
D3DXMatrixIdentity( &matBlend1 );
m_pD3DDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matBlend );

인덱스 첨부 정점 혼합의 유효와 무효를 바꾸려면 ,D3DRS_INDEXEDVERTEXBLENDENABLE 렌더링 스테이트를 TRUE 로 설정한다. 이 렌더링 스테이트가 유효하게 되어 있는 경우는, 정점 마다 팩 DWORD 로 행렬 인덱스를 건네주지 않으면 안 된다. 이 렌더링 스테이트를 무효로 해, 정점 혼합을 유효하게 하는 것은, 모든 정점에 대해 행렬 인덱스 0, 1, 2, 3 을 지정하는 것에 동일하다. 다음 코드는,IDirect3DDevice9::SetRenderState 메서드를 사용해, 인덱스 첨부 정점 혼합을 유효하게 한다.

m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );    

정점 혼합의 유효와 무효를 바꾸려면 ,IDirect3DDevice9::SetRenderState 렌더링 스테이트를 D3DVERTEXBLENDFLAGS 열거형의 D3DRS_DISABLE 이외의 값으로 설정한다. 이 렌더링 스테이트가 D3DRS_DISABLE 로 설정되지 않은 경우는, 각 정점에 필요한 중량감의 수를 건네주지 않으면 안 된다. 다음 코드는,IDirect3DDevice9::SetRenderState 를 사용해, 각 정점에 대해서 3 개의 중량감으로 정점 혼합을 유효하게 한다.

m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_3WEIGHTS );

인덱스 첨부 정점 혼합의 지원의 판정

인덱스 첨부 정점 혼합 행렬의 최대 사이즈를 판정하려면 ,D3DCAPS9 구조체의 MaxVertexBlendMatrixIndex 멤버를 조사한다. 다음 코드는,IDirect3DDevice9::GetDeviceCaps 메서드를 사용해, 이 사이즈를 얻어온다.

D3DCAPS9 d3dCaps;
    
m_pD3DDevice->GetDeviceCaps( &d3dCaps );
IndexedMatrixMaxSize = d3dCaps.MaxVertexBlendMatrixIndex;    

MaxVertexBlendMatrixIndex 로 설정된 값이 0 의 경우, 장치는 인덱스 첨부의 행렬을 지원 하고 있지 않다.

  소프트웨어 정점 처리가 사용되고 있는 경우는, 법선 혼합이 있어도 없어도, 256 개의 행렬을 인덱스 첨부 정점 혼합에 사용할 수 있다.

Direct3D 에 대한 행렬 인덱스의 수수

월드 행렬 인덱스는, 종래의 정점 셰이더인 유연한 정점 포맷 (FVF) 또는 선언을 사용해 Microsoft® Direct3D® 에 건네줄 수가 있다.

다음 코드는, 종래의 정점 셰이더의 사용법을 나타내고 있다.

struct VERTEX
{
    float x, y, z;
    float weight;
    DWORD matrixIndices;
    float normal[3];
};
    
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZB2 | D3DFVF_LASTBETA_UBYTE4 |
                             D3DFVF_NORMAL);

종래의 정점 셰이더를 사용하는 경우, 행렬 인덱스는 D3DFVF_XYZBn 플래그를 사용해 정점 위치와 함께 건네받는다. 행렬 인덱스는 DWORD 내의 바이트로서 건네받아 마지막 정점 가중의 직후에 존재해야 한다. 정점 가중도 D3DFVF_XYZBn 를 사용해 건네받는다. 팩 DWORD 는, index3, index2, index1, index0 를 보관 유지해, index0 는 DWORD 의 최하정도 바이트에 있다. 사용되는 월드 행렬 인덱스의 수는,D3DRENDERSTATETYPE 열거형에 의해 정의되는 혼합에 사용되는 행렬의 수에게 건네지는 수치에 동일하다.

선언을 사용하는 경우는, D3DVSDE_BLENDINDICES 가 행렬 인덱스를 얻어온다 입력 정점 레지스터를 정의한다. 행렬 인덱스는, D3DVSDT_UBYTE4 로서 건네줄 필요가 있다.

다음 코드는, 선언의 사용법을 나타내고 있다. 고정 기능에 의한 정점 셰이더를 사용하지 않는 이상 성분의 순서는 완전히 중요하지 않는 점에 주의 해야 한다.

다음에 정점의 선언을 나타낸다.

struct VERTEX
{
    float x, y, z;
    float weight;
    DWORD matrixIndices;
    float normal[3];
}

다음에, 대응하는 레지스터의 선언을 나타낸다.

// Create the shader declaration.
D3DVERTEXELEMENT9 decl[] = 
{
	{ 0, 0,  D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
	{ 0, 12, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0 },
	{ 0, 16, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 },
	{ 0, 20, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
	D3DDECL_END()
};


© 2002 Microsoft Corporation. All rights reserved.
↑TOP