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

지오메트리 혼합


Microsoft® Direct3D® 에서는, 간접부가 매끄럽게 블렌드 되고 있는 분할된 다각형 개체(특히 캐릭터)를 렌더링 하는 것으로, 장면(scene)를 한층 리얼하게 표현할 수 있다. 이러한 이펙트를 일반적으로 스키닝이라고 부른다. 이 이펙트는, 추가의 월드 변환 행렬을 개별의 정점군에게 적용해, 그 결과 생성되는 변환 후의 복수의 정점간에 선형 블렌드를 실행해 렌더링용의 단일의 지오메트리를 생성하는 것으로 실현된다. 다음의 바나나의 일러스트는, 이 예를 나타내고 있다.

바나나의 텍스처를 가지는 2 개의 개체를 혼합에 의해 합성한 것

이 화면은, 지오메트리 혼합의 처리가 어떠한 것인지를 나타내고 있다. 1 회의 렌더링의 호출로, 시스템은 바나나의 정점을 취득해, 이 정점에 대해서 회전하지 않는 변환과 단순한 회전의 변환을 1 회씩 실행해, 그 결과 구부러진 바나나를 생성한다. 시스템은, 조명이 유효한 경우에, 정점 법선 뿐만이 아니라 정점 위치도 블렌드 한다. 애플리케이션은 2 개의 혼합 방법으로 한정되는 것은 아니다. Direct3D 는, 최대 4 개의 월드 행렬 (표준 월드 행렬의 D3DTS_WORLD 등) 간에서 지오메트리를 블렌드 할 수 있다.

  

조명이 유효하게 되어 있는 경우, 정점 법선이, 대응하는 월드 뷰 행렬의 역행열에 의해 변환 된다. 이 때, 중요는, 정점 위치의 계산의 경우와 같게 행해진다. D3DRS_NORMALIZENORMALS 렌더링 스테이트가 TRUE 로 설정되어 있는 경우는, 결과의 법선 벡터가 시스템에 의해 정규화된다.

가동 결합부가 있는 모델의 경우, 지오메트리 혼합을 사용하지 않고 부분 마다 렌더링 되는 것이 많다. 예를 들어, 인간의 팔의 3D 모델을 생각하자. 가장 단순하게 해, 팔에는 신체로 연결되는 상완과 손으로 연결되는 팔뚝이 있다. 2 개의 팔은 함께 팔꿈치로 연결되어 있어 팔뚝은 이 정도치좌표로 회전한다. 애플리케이션으로 팔을 렌더링 하는 경우, 상완과 팔뚝의 정점 데이터는 보관 유지되어 각각 개별의 월드 변환 행렬이 적용된다. 다음 샘플 코드는, 이것을 나타내고 있다.

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.

팔을 렌더링 하려면 , 다음 코드로 가리키도록(듯이), 렌더링의 호출을 2 회 실행한다.

// 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 의 지오메트리 혼합에서는, 종래의 세그먼트(segment) 모델 시나리오를 사용할 수도 있다. 그러나, 분할되고 있는 각각의 개체의 표시 품질을 올리려면 , 렌더링시의 혼합 계산이 필요하다. 이러한 추가 처리에 의한 영향을 최소한으로 억제하기 위해서(때문에), Direct3D 지오메트리 파이프라인은, 가능한 한 오버헤드를 발생시키지 않고 지오메트리를 블렌드 할 수 있도록(듯이) 최적화한다. 애플리케이션에서는 Direct3D 의 지오메트리 혼합 서비스를 유효하게 사용하는 것으로, 퍼포먼스에의 심각한 영향을 피하면서, 캐릭터를 보다 진짜인것 같게 표현할 수 있다.

혼합 변환과 렌더링 스테이트

IDirect3DDevice9::SetTransform 메서드는,D3DTS_WORLD 매크로 및 D3DTS_WORLDn 매크로를 인식하지만, 이러한 매크로는 D3DTS_WORLDMATRIX 매크로에 의해 정의되는 값에 대응한다. 이러한 매크로를 사용해, 지오메트리가 블렌드 될 때의 행렬을 식별한다.

D3DRENDERSTATETYPE 열거형에는, 지오메트리 혼합을 유효하게 해 제어하는 D3DRS_VERTEXBLEND 렌더링 스테이트가 포함된다. 이 렌더링 스테이트의 유효값은,D3DVERTEXBLENDFLAGS 열거형에 의해 정의된다. 지오메트리 혼합이 유효하게 되어 있는 경우, 정점 포맷에는 혼합의 적절한 가중값이 포함되지 않으면 안 된다.

혼합의 중량감

혼합의 중량감 (베타의 중량감이라고 부를 때도 있다)은, 지정된 월드 행렬에 의해 정점이 받는 영향의 범위를 제어한다. 혼합의 중량감이란, 0.0 ~ 1.0 의 범위의 부동 소수점값이며, 정점 포맷으로 encode 된다. 값이 0.0 의 경우, 정점은 그 행렬로 블렌드 되지 않는다. 값이 1.0 의 경우, 정점은 행렬의 영향을 모두 받는다.

지오메트리 혼합의 중량감은, 정점 포맷으로 encode 되어 「정점 포맷」으로 설명하도록(듯이), 각 정점의 위치 좌표의 바로 후에 나타난다. Direct3D 렌더링 메서드로 지정하는 정점 기술에 D3DFVF_XYZB1 ~ D3DFVF_XYZB5 의 유연한 정점 포맷 플래그 (D3DFVF )의 어느쪽이든을 포함하는 것으로, 정점 포맷에 혼합의 중량감을 지정한다.

중요 된 블렌드 행렬간으로, 시스템에 의해 선형 블렌드가 실행된다. 다음에, 정식적 혼합 공식을 나타낸다.

월드 변환 행렬을 사용한 선형 블렌드의 공식

이 공식에서는,vBlend 는 출력 정점이며, v 요소는 적용 후의 월드 행렬 (D3DTS_WORLDn)에 의해 생성되는 정점이다. W 요소는, 정점 포맷내의 대응하는 중량감이다. n 개의 행렬간에 블렌드 되는 정점은,–1 개의 혼합의 중량감을 가질 수가 있다 (마지막 혼합 행렬을 제외해, 각 혼합 행렬에 1 개의 중량감). 마지막 월드 행렬의 중량감은, 이 공식에서는 Σ 으로 나타내도록(듯이), 중량감의 합계가 1.0 이 되도록(듯이) 시스템에 의해 자동적으로 생성된다. 이 공식은, Direct3D 가 지원 하고 있는 케이스에 맞추어 간략화할 수 있다.

이 공식에서는,vBlend 는 출력 정점이며, v 요소는 적용 후의 월드 행렬에 의해 생성되는 정점이다. W 요소는, 정점 포맷내의 대응하는 중량감이다. n 개의 행렬간에 블렌드 되는 정점은,–1 개의 혼합의 중량감을 가질 수가 있다 (마지막 혼합 행렬을 제외해, 각 혼합 행렬에 1 개의 중량감). 마지막 월드 행렬의 중량감은, 이 공식에서는 Σ 으로 나타내도록(듯이), 중량감의 합계가 1.0 이 되도록(듯이) 시스템에 의해 자동적으로 생성된다. 이 공식은, Direct3D 가 지원 하고 있는 케이스에 맞추어 간략화할 수 있다.

3 개의 케이스의 선형 블렌드의 공식

이러한 공식은, 정식적 혼합 공식을, 2, 3, 4 개의 블렌드 행렬의 케이스에 맞추어 간략화한 것이다.

  Direct3D 에서는, 최대 5 개의 혼합의 중량감을 가지는 정점을 정의하는 유연한 정점 포맷 기술자를 포함할 수가 있지만, 이 릴리스의 Microsoft DirectX® 에서는 3 개까지 밖에 사용할 수 없다.

더 자세한 정보는, 다음 주제를 참조할것.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP