인덱싱된 꼭짓점 혼합 사용(Direct3D 9)

변환 상태 256-511은 8비트 인덱스를 사용하여 인덱싱할 수 있는 최대 256개의 행렬을 저장하도록 예약되어 있습니다. 매크로 D3DTS_WORLDMATRIX 사용하여 인덱스 0-255를 해당 변환 상태에 매핑합니다. 다음 코드 예제에서는 IDirect3DDevice9::SetTransform 메서드를 사용하여 변환 상태 번호 256에서 행렬을 ID 행렬로 설정하는 방법을 보여 줍니다.

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) 또는 선언을 사용하여 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의 가장 낮은 바이트에 있습니다. 사용된 world-matrix 인덱스의 수는 D3DRS_VERTEXBLEND 정의한 대로 혼합에 사용되는 행렬 수에 전달된 수와 같습니다.

선언을 사용하는 경우 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()
};

인덱싱된 꼭짓점 혼합