Share via


기하 도형 혼합(Direct3D 9)

Direct3D를 사용하면 애플리케이션이 부드럽게 혼합된 조인트를 가진 분할된 다각형 개체( 특히 문자)를 렌더링하여 장면의 리얼리즘을 높일 수 있습니다. 이러한 효과는 종종 스키닝이라고합니다. 시스템은 단일 꼭짓점 집합에 추가 월드 변환 매트릭스를 적용하여 여러 결과를 만든 다음 결과 꼭짓점 간에 선형 혼합을 수행하여 렌더링을 위한 단일 기하 도형 집합을 만들어 이 효과를 달성합니다. 다음 바나나 그림에서는 이 프로세스를 보여 줍니다.

두 개체를 바나나 텍스처와 혼합하는 프로세스의 그림

앞의 그림에서는 기하 도형 혼합 프로세스를 어떻게 상상할 수 있는지 보여 줍니다. 단일 렌더링 호출에서 시스템은 바나나에 대한 꼭짓점을 사용하고 수정하지 않고 한 번, 간단한 회전으로 한 번 두 번 변환하고 결과를 혼합하여 구부러진 바나나를 만듭니다. 시스템은 조명을 사용할 때 꼭짓점 위치와 꼭짓점 법선이 혼합됩니다. 애플리케이션은 두 개의 혼합 경로로 제한되지 않습니다. Direct3D는 표준 월드 행렬을 포함하여 4개의 월드 매트릭스 간에 기하 도형을 혼합할 수 D3DTS_WORLD.

참고

조명을 사용하도록 설정하면 꼭짓점 위치 계산과 동일한 방식으로 가중치가 적용된 해당 역세계 보기 행렬에 의해 꼭짓점 법선이 변환됩니다. D3DRS_NORMALIZENORMALS 렌더링 상태가 TRUE로 설정된 경우 시스템은 결과 일반 벡터를 정규화 합니다.

 

기하 도형 혼합이 없으면 동적 관절형 모델은 종종 세그먼트로 렌더링됩니다. instance 경우 인간 팔의 3D 모델을 고려합니다. 가장 간단한 보기에서 팔에는 몸에 연결되는 상완과 손에 연결되는 하반신의 두 부분이 있습니다. 두 가지는 팔꿈치에 연결되고 하완은 해당 지점에서 회전합니다. 암을 렌더링하는 애플리케이션은 각각 별도의 월드 변환 매트릭스가 있는 상완과 하부 암에 대한 꼭짓점 데이터를 유지할 수 있습니다. 다음 코드 예제에서는 그 구체적인 방법을 보여 줍니다.

typedef struct _Arm
{
    VERTEX upper_arm_verts[200];
    D3DMATRIX matWorld_Upper;

    VERTEX lower_arm_verts[200];
    D3DMATRIX matWorld_Lower;
} ARM, *LPARM;

ARM MyArm; // This needs to be initialized.

팔을 렌더링하기 위해 다음 코드와 같이 두 번의 렌더링 호출이 수행됩니다.

// Render the upper arm.
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Upper );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

// Render the lower arm, updating its world matrix to articulate
// the arm by pi/4 radians (45 degrees) at the elbow.
MyArm.matWorld_Lower = RotateMyArm(MyArm.matWorld, pi/4);
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Lower );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

다음 그림은 이 기술을 사용하도록 수정된 바나나입니다.

기하 도형 혼합이 없는 혼합 바나나 그림

혼합 기하 도형과 블렌딩되지 않은 기하 도형의 차이점은 분명합니다. 이 예제는 다소 극단적입니다. 실제 애플리케이션에서 분할된 모델의 조인트 는 솔기가 명확하지 않도록 설계되었습니다. 그러나 이음새는 때때로 표시되어 모델 디자이너에게 일정한 과제를 제시합니다.

Direct3D의 기하 도형 혼합은 클래식 세그먼트 모델링 시나리오의 대안을 제공합니다. 그러나 분할된 개체의 시각적 품질이 향상되면 렌더링 중에 혼합 계산 비용이 발생합니다. 이러한 추가 작업의 영향을 최소화하기 위해 Direct3D 기하 도형 파이프라인은 최소 오버헤드와 기하 도형을 혼합하도록 최적화됩니다. Direct3D에서 제공하는 기하 도형 혼합 서비스를 지능적으로 사용하는 애플리케이션은 심각한 성능 영향을 피하면서 문자의 리얼리즘을 향상시킬 수 있습니다.

변환 및 렌더링 상태 혼합

IDirect3DDevice9::SetTransform 메서드는 D3DTS_WORLDMATRIX 매크로에서 정의할 수 있는 값에 해당하는 D3DTS_WORLDD3DTS_WORLDn 매크로를 인식합니다. 이러한 매크로는 기하 도형이 혼합될 행렬을 식별하는 데 사용됩니다.

D3DRENDERSTATETYPE 열거형 형식에는 기하 도형 혼합을 사용하도록 설정하고 제어하는 D3DRS_VERTEXBLEND 렌더링 상태가 포함됩니다. 이 렌더링 상태의 유효한 값은 D3DVERTEXBLENDFLAGS 열거형 형식으로 정의됩니다. 기하 도형 혼합을 사용하는 경우 꼭짓점 형식에는 적절한 수의 혼합 가중치가 포함되어야 합니다.

혼합 가중치

베타 가중치라고도 하는 혼합 가중치는 지정된 월드 행렬이 꼭짓점에 미치는 영향을 제어합니다. 혼합 가중치는 0.0에서 1.0까지의 부동 소수점 값이며 꼭짓점 형식으로 인코딩됩니다. 여기서 값 0.0은 꼭짓점이 해당 행렬과 혼합되지 않음을 의미하며, 1.0은 꼭짓점이 행렬에 의해 완전히 영향을 받는다는 것을 의미합니다.

기하 도형 혼합 가중치는 고정 함수 FVF 코드(Direct3D 9)에 설명된 대로 각 꼭짓점의 위치 바로 다음에 나타나는 꼭짓점 형식으로 인코딩됩니다. 렌더링 메서드에 제공하는 꼭짓점 설명에 FVF 상수 중 하나를 포함하여 꼭짓점 형식의 혼합 가중치 수를 전달합니다.

시스템은 혼합 행렬의 가중치 결과 간에 선형 혼합을 수행합니다. 다음 수식은 완전한 혼합 수식입니다.

세계 변환 행렬을 사용하는 선형 혼합의 수식

앞의 수식에서 vBlend는 출력 꼭짓점이고, v 요소는 적용된 월드 행렬(D3DTS_WORLDn)에서 생성된 꼭짓점입니다. W 요소는 꼭짓점 형식 내의 해당 가중치 값입니다. n 행렬 사이에 혼합된 꼭짓점은 1개의 혼합 가중치 값을 가질 수 있으며, 마지막을 제외한 각 혼합 행렬에 대해 하나씩 가능합니다. 시스템은 모든 가중치의 합계가 1.0이 되도록 마지막 월드 행렬에 대한 가중치를 자동으로 생성하며 여기서 시그마 표기법으로 표현됩니다. 이 수식은 다음 수식에 표시된 Direct3D에서 지원하는 각 사례에 대해 간소화할 수 있습니다.

세 가지 혼합 사례에 대한 선형 혼합 수식

다음은 2, 3 및 4 혼합 매트릭스 사례에 대한 완전한 혼합 수식의 간소화된 형태입니다.

참고

Direct3D에는 최대 5개의 혼합 가중치가 포함된 꼭짓점을 정의하는 FVF 설명자가 포함되어 있지만 이 DirectX 릴리스에서는 3개만 사용할 수 있습니다.

 

추가 정보는 다음 topics 포함되어 있습니다.

꼭짓점 파이프라인