인덱싱된 꼭짓점 혼합 사용(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()
};
관련 항목