뷰포트 및 클리핑(Direct3D 9)

개념적으로 뷰포트는 3D 장면이 프로젝트되는 2D(2차원) 사각형입니다. Direct3D에서 사각형은 시스템에서 렌더링 대상으로 사용하는 Direct3D 표면 내의 좌표로 존재합니다. 프로젝션 변형은 꼭짓점을 뷰포트에 사용되는 좌표계로 변환합니다. 뷰포트는 장면이 렌더링될 렌더링 대상 표면의 깊이 값 범위를 지정하는 데에도 사용됩니다(일반적으로 0.0~1.0).

절두체 보기

절두체 보기는 뷰포트의 카메라를 기준으로 배치되는 장면의 3D 볼륨입니다. 볼륨의 셰이프는 모델을 카메라 공간에서 장면으로 프로젝션하는 방법에 영향을 미칩니다. 가장 일반적인 프로젝션 유형인 원근 프로젝션은 카메라에 가까운 개체를 멀리 있는 개체보다 더 크게 표시합니다. 원근 보기의 경우 절두체 보기를 피라미드로 시각화하고, 다음 그림과 같이 카메라를 끝에 배치할 수 있습니다. 이 피라미드에서 전면 및 후면 클리핑 평면이 교차합니다. 전면 및 후면 클리핑 평면 사이의 피라미드 내부에 있는 볼륨이 절두체 보기입니다. 개체는 이 볼륨에 있을 때에만 표시됩니다.

illustration of a viewing frustrum with a front and back clipping plan

절두체 보기를 시각화한다는 것은 어두운 방에 서서 사각형 창을 통해 내다보는 행동에 비유할 수 있습니다. 이 비유에서 가까운 클리핑 평면은 창이고, 후면 클리핑 평면은 시야를 방해하는 모든 것입니다. 거리의 고층 빌딩이 될 수도 있고, 멀리 있는 산이 될 수도 있고, 전혀 없을 수도 있습니다. 창에서 시작하고 시야를 방해하는 물체에서 끝이 나는 잘린 피라미드 내의 모든 것을 볼 수 있지만, 그 외에는 아무 것도 볼 수 없습니다.

절두체 보기는 fov(보기 필드)와 전면 및 후면 클리핑 평면의 거리로 정의되며 다음 다이어그램과 같이 z축 좌표로 지정됩니다.

diagram of the viewing frustum

이 다이어그램에서 변수 D는 카메라에서 기하 도형 파이프라인의 마지막 부분에서 정의된 공간 원점까지의 거리이며 이것이 보기 변형입니다. 이 공간을 기준으로 절두체 보기의 제한을 지정합니다. 이 D 변수를 사용하여 프로젝션 매트릭스를 빌드하는 방법에 대한 자세한 내용은 프로젝션 변환(Direct3D 9)을 참조 하세요.

뷰포트 사각형

D3DVIEWPORT9 구조를 사용하여 C++에서 뷰포트 사각형을 정의합니다. D3DVIEWPORT9 구조체는 IDirect3DDevice9 인터페이스에 의해 노출되는 다음 뷰포트 조작 메서드와 함께 사용됩니다.

D3DVIEWPORT9 구조체에는 장면이 렌더링될 렌더링 대상 표면의 영역을 정의하는 4개의 멤버(X, Y, Width, Height)가 포함됩니다. 이러한 값은 다음 다이어그램과 같이 대상 사각형 또는 뷰포트 사각형에 해당합니다.

diagram of the viewport rectangle

X, Y, 너비, 높이 요소에 지정한 값은 렌더링 대상 표면의 왼쪽 위 모서리를 기준으로 하는 화면 좌표입니다. 구조는 장면이 렌더링되는 깊이 범위를 나타내는 두 가지 추가 요소(MinZ 및 MaxZ)를 정의합니다.

Direct3D에서는 뷰포트 클리핑 볼륨 범위를 X축은 -1.0~1.0, Y축은 1.0~-1.0로 간주합니다. 이 값은 이전의 애플리케이션에서 가장 자주 사용되던 설정입니다. 프로젝션 변형을 사용하여 클리핑하기 전에 뷰포트 가로 세로 비율을 조정할 수 있습니다.

참고 항목

MinZ 및 MaxZ는 장면이 렌더링되고 클리핑에 사용되지 않는 깊이 범위를 나타냅니다. 대부분의 애플리케이션은 이러한 멤버를 0.0 및 1.0으로 설정하여 시스템이 깊이 버퍼의 전체 깊이 값 범위로 렌더링할 수 있도록 합니다. 경우에 따라 다른 깊이 범위를 사용하여 특수 효과를 얻을 수 있습니다. 예를 들어 게임에서 헤드업 디스플레이를 렌더링하려면 두 값을 0.0으로 설정하여 시스템이 포그라운드의 장면에서 개체를 렌더링하도록 강제할 수 있습니다. 또는 둘 다 1.0으로 설정하여 항상 백그라운드에 위치하는 개체를 렌더링할 수 있습니다.

 

뷰포트에 대한 D3DVIEWPORT9 구조체의 X, Y, Width, Height 멤버에 사용되는 차원은 렌더링 대상 화면에서 뷰포트의 위치와 차원을 정의합니다. 이러한 값은 표면의 왼쪽 위 모서리를 기준으로 하는 장면 좌표입니다.

Direct3D는 뷰포트 위치 및 차원을 사용하여 렌더링된 장면이 대상 표면의 적절한 위치에 오도록 꼭짓점을 조정합니다. 내부적으로 Direct3D는 이러한 값을 각 꼭짓점에 적용되는 다음 행렬에 삽입합니다.

equation of the matrix that is applied to each vertex

이 행렬은 뷰포트 차원 및 원하는 깊이 범위에 따라 꼭짓점의 크기를 조정하고 렌더링 대상 표면의 적절한 위치로 좌표 이동합니다. 또한 이 행렬은 y축 좌표를 돌려서 왼쪽 위 모서리에서 y축이 마이너스 방향으로 증가하는 화면 원점을 반영합니다. 이 행렬이 적용된 후에도 꼭짓점은 여전히 유형이 같습니다. 즉, [x,y,z,w] 꼭짓점으로 계속 존재하며, 래스터라이저로 꼭짓점을 전송하려면 다른 유형으로 변환해야 합니다.

참고 항목

뷰포트 크기 조정 매트릭스는 깊이 범위 [MinZ, MaxZ]에 맞게 꼭짓점 크기를 조정하기 위해 D3DVIEWPORT9 구조체의 MinZ 및 MaxZ 멤버를 통합합니다. 이는 이러한 멤버가 클리핑에 사용된 DirectX의 이전 릴리스와 다른 의미 체계를 나타냅니다.

 

참고 항목

일반적으로 애플리케이션은 MinZ 및 MaxZ를 각각 0.0 및 1.0으로 설정하여 시스템이 전체 깊이 범위로 렌더링되도록 합니다. 그러나 특정 효과를 얻기 위해 다른 값을 사용해도 됩니다. 예를 들어 둘 다 0.0으로 설정하여 모든 개체를 포그라운드에 렌더링할 수도 있고, 둘 다 1.0으로 설정하여 모든 개체를 백그라운드에 렌더링할 수도 있습니다.

 

뷰포트 지우기

뷰포트를 지우면 렌더링 대상 표면에서 뷰포트 사각형의 내용이 초기화됩니다. 깊이 및 스텐실 버퍼 표면의 사각형이 지워질 수도 있습니다.

IDirect3DDevice9::Clear를 사용하여 뷰포트를 지웁니다. 이 메서드는 지워지는 표면의 영역을 정의하는 하나 이상의 사각형을 허용합니다. Count 매개 변수를 1로 설정하고 pRects 매개 변수를 전체 뷰포트 영역을 포함하는 단일 사각형의 주소로 설정하면 전체 뷰포트가 지워지게 됩니다. 전체 뷰포트를 지우는 또 다른 방법은 pRects 매개 변수를 NULL설정하고 Count 매개 변수를 0으로 설정하는 것입니다.

IDirect3DDevice9::Clear는 깊이 버퍼 내에서 스텐실 비트를 지우는 데 사용할 수 있습니다. 플래그 매개 변수를 설정하여 IDirect3DDevice9::Clear가 렌더링 대상 및 연결된 깊이 또는 스텐실 버퍼에서 작동하는 방식을 결정합니다. D3DCLEAR_TARGET 플래그는 색 인수에 제공하는 임의의 RGBA 색을 사용하여 뷰포트를 지웁니다(재질 색이 아님). D3DCLEAR_ZBUFFER 플래그는 Z에서 지정한 임의의 깊이로 깊이 버퍼를 지웁니다. 0.0은 가장 가까운 거리이고 1.0은 가장 먼 거리입니다. D3DCLEAR_STENCIL 플래그는 스텐실 비트를 스텐실 인수에 제공한 값으로 다시 설정합니다. 0에서 2n-1까지의 정수(n은 스텐실 버퍼 비트 깊이)를 사용할 수 있습니다.

경우에 따라 렌더링 대상 및 깊이 버퍼 표면의 작은 부분에만 렌더링할 수 있습니다. 또한 명확한 메서드를 사용하면 단일 호출로 표면의 여러 영역을 지울 수 있습니다. Count 매개 변수를 지울 사각형 수로 설정하고 pRects 매개 변수의 사각형 배열에서 첫 번째 사각형의 주소를 지정합니다.

클리핑할 뷰포트 설정

프로젝션 행렬의 결과는 다음과 같이 프로젝션 공간의 클리핑 볼륨을 결정합니다.

-wc<= xc<= wc

-wc<= yc<= wc

0 <= zc<= wc

여기서 x, y, z, w는 프로젝션 변형이 적용된 후의 꼭짓점 좌표를 나타냅니다. 클리핑이 사용하도록 설정된 경우(기본 동작) 이러한 범위 밖의 x, y 또는 z축 구성 요소를 포함한 꼭짓점은 클리핑됩니다.

꼭짓점 버퍼를 제외하고 애플리케이션은 D3DRS_CLIPPING 렌더링 상태를 통해 클리핑을 사용하거나 사용하지 않도록 설정합니다. 꼭짓점 버퍼에 대한 클리핑 정보는 처리 중에 생성됩니다. 자세한 내용은 고정 함수 꼭짓점 처리(Direct3D 9)프로그래밍 가능한 꼭짓점 처리(Direct3D 9)를 참조하세요.

Direct3D는 IDirect3DDevice9::P rocessVertices에서 제공되지 않는 한 꼭짓점 버퍼에서 기본 형식의 변환된 꼭짓점을 클립하지 않습니다. 고유한 변환을 수행하고 클리핑을 수행하는 데 Direct3D가 필요한 경우 꼭짓점 버퍼를 사용하면 안 됩니다. 이 경우 애플리케이션은 데이터를 트래버스하여 변환합니다. Direct3D는 데이터를 두 번째로 트래버스하여 클리핑한 다음, 드라이버는 비효율적인 데이터를 렌더링합니다. 따라서 애플리케이션이 데이터를 변환하는 경우 데이터를 클리핑해야 합니다.

디바이스가 잘려야 하는 미리 변환되고 조명된 꼭짓점(T&L 꼭짓점)을 수신하는 경우 클리핑 작업을 수행하기 위해 꼭짓점은 꼭짓점의 RHW(상호 동질 w) 및 뷰포트 정보를 사용하여 클리핑 공간으로 다시 변환됩니다. 그런 다음 클리핑이 수행됩니다. 모든 디바이스가 T&L 꼭짓점을 잘라내기 위해 이 백 변환을 수행할 수 있는 것은 아닙니다.

D3DPMISCCAPS_CLIPTLVERTS 디바이스 기능은 디바이스가 T&L 꼭짓점을 클리핑할 수 있는지 여부를 나타냅니다. 이 기능이 설정되지 않은 경우 애플리케이션은 렌더링할 디바이스로 전송하려는 T&L 꼭짓점을 클리핑합니다. 디바이스는 항상 소프트웨어 꼭짓점 처리 모드에서 T&L 꼭짓점을 클리핑할 수 있습니다(디바이스가 소프트웨어 꼭짓점 처리 모드에서 만들어지거나 소프트웨어 꼭짓점 처리 모드로 전환되었는지 여부에 관계 없이).

렌더링 디바이스에 대한 뷰포트 매개 변수를 구성하기 위한 유일한 요구 사항은 뷰포트의 클리핑 볼륨을 설정하는 것입니다. 이렇게 하려면 클리핑 볼륨 및 렌더링 대상 화면에 대한 클리핑 값을 초기화하고 설정합니다. 뷰포트는 일반적으로 렌더링 대상 화면의 전체 영역으로 렌더링되도록 설정되지만 이는 요구 사항이 아닙니다.

C++에서 이를 달성하기 위해 D3DVIEWPORT9 구조체의 멤버에 대해 다음 설정을 사용할 수 있습니다.

D3DVIEWPORT9 viewData = { 0, 0, width, height, 0.0f, 1.0f };

D3DVIEWPORT9 구조체에서 값을 설정한 후 IDirect3DDevice9::SetViewport 메서드를 호출하여 뷰포트 매개 변수를 디바이스에 적용합니다. 다음 코드 예제에서는 이 호출이 어떤 모습일지 보여줍니다.

HRESULT hr;

hr = pd3dDevice->SetViewport(&viewData);
if(FAILED(hr))
    return hr;

호출이 성공하면 뷰포트 매개 변수가 설정되고 다음에 렌더링 메서드가 호출될 때 적용됩니다. 뷰포트 매개 변수를 변경하려면 D3DVIEWPORT9 구조체의 값을 업데이트하고 IDirect3DDevice9::SetViewport를 다시 호출합니다.

참고 항목

D3DVIEWPORT9 구조체 멤버 MinZ 및 MaxZ는 장면이 렌더링되고 클리핑에 사용되지 않는 깊이 범위를 나타냅니다. 대부분의 애플리케이션은 이러한 멤버를 0.0 및 1.0으로 설정하여 시스템이 깊이 버퍼의 전체 깊이 값 범위로 렌더링할 수 있도록 합니다. 경우에 따라 다른 깊이 범위를 사용하여 특수 효과를 얻을 수 있습니다. 예를 들어 게임에서 헤드업 디스플레이를 렌더링하려면 두 값을 0.0으로 설정하여 시스템이 포그라운드의 장면에서 개체를 렌더링하도록 강제할 수 있습니다. 또는 둘 다 1.0으로 설정하여 항상 백그라운드에 위치하는 개체를 렌더링할 수 있습니다.

 

시작